From: <ro...@us...> - 2006-06-11 17:23:57
|
Revision: 16255 Author: roast Date: 2006-06-11 10:23:51 -0700 (Sun, 11 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16255&view=rev Log Message: ----------- logging timestamps are corrected Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-11 06:05:09 UTC (rev 16254) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-11 17:23:51 UTC (rev 16255) @@ -738,12 +738,16 @@ GaimLog *log; GaimLogCommonLoggerData *data; struct tm tm; + const char *thetimestamp = (const char *)g_strrstr(filename, "_"); + #if defined (HAVE_TM_GMTOFF) && defined (HAVE_STRUCT_TM_TM_ZONE) long tz_off; const char *rest; - time_t stamp = gaim_str_to_time(gaim_unescape_filename(filename), FALSE, &tm, &tz_off, &rest); + time_t stamp = gaim_str_to_time(gaim_unescape_filename(thetimestamp), FALSE, &tm, &tz_off, &rest); char *end; + thetimestamp = (thetimestamp != NULL) ? thetimestamp + sizeof(gchar) : filename; + /* As zero is a valid offset, GAIM_NO_TZ_OFF means no offset was * provided. See util.h. Yes, it's kinda ugly. */ if (tz_off != GAIM_NO_TZ_OFF) @@ -761,8 +765,10 @@ g_free(tmp); } #else - time_t stamp = gaim_str_to_time(filename, FALSE, &tm, NULL, NULL); + thetimestamp = (thetimestamp != NULL) ? thetimestamp + sizeof(gchar) : filename; + time_t stamp = gaim_str_to_time(thetimestamp, FALSE, &tm, NULL, NULL); + log = gaim_log_new(type, name, account, NULL, stamp, &tm); #endif @@ -968,12 +974,11 @@ const char *from, time_t time, const char *message) { char *msg_fixed; - const char *date = gaim_utf8_strftime("%F %T%z", localtime(&log->time)); + const char *date = gaim_utf8_strftime("%F %T%z", localtime(&time)); GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); GaimLogCommonLoggerData *data = log->logger_data; gsize written = 0; - GaimLogType original_type = log->type; /* This log is new. We could use the loggers 'new' function, but * creating a new file there would result in empty files in the case @@ -981,6 +986,7 @@ */ if (!log->logger_data) { const char *prpl = GAIM_PLUGIN_PROTOCOL_INFO(plugin)->list_icon(log->account, NULL); + gaim_log_common_writer(log, ".chatlog"); data = log->logger_data; @@ -988,6 +994,10 @@ // if file doesn't exist, die if (!data->file) return 0; + // because gaim_utf8_strftime returns a pointer to static data, + // and was called in gaim_log_common_writer + date = gaim_utf8_strftime("%F %T%z", localtime(&time)); + fprintf(data->file, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); if (log->type == GAIM_LOG_SYSTEM) @@ -996,7 +1006,7 @@ else written += fprintf(data->file, "<chat service=\"%s\" account=\"%s\" version=\"0.3.1-04\">\n", prpl, gaim_account_get_username(log->account)); - written += fprintf(data->file, "\t<event time=\"%s\" type=\"logStart\" \/>\n", date); + written += fprintf(data->file, "\t<event time=\"%s\" type=\"logStart\" />\n", date); } /* if we can't write to the file, give up before we hurt ourselves */ @@ -1028,11 +1038,12 @@ written += fprintf(data->file, "\t<message time=\"%s\" sender=\"%s\">%s</message>\n", date, from, msg_fixed); } - // TODO: haven't written end of file and seeked back - g_free(msg_fixed); fflush(data->file); + // TODO: haven't written end of file and seeked back + // TODO: this is to keep a valid XML document out of the user space buffer + return written; } @@ -1041,8 +1052,8 @@ GaimLogCommonLoggerData *data = log->logger_data; if (data) { if (data->file) { - const char *date = gaim_utf8_strftime("%F %T%z", localtime(&log->time)); - fprintf(data->file, "\t<event time=\"%s\" type=\"logEnd\" \/>\n", date); + const char *date = gaim_utf8_strftime("%F %T%z", localtime(NULL)); + fprintf(data->file, "\t<event time=\"%s\" type=\"logEnd\" />\n", date); fprintf(data->file, "</conversation>\n"); fclose(data->file); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-06-11 17:50:51
|
Revision: 16256 Author: roast Date: 2006-06-11 10:50:47 -0700 (Sun, 11 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16256&view=rev Log Message: ----------- a small out of order execution when trying to eliminate warnings Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-11 17:23:51 UTC (rev 16255) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-11 17:50:47 UTC (rev 16256) @@ -743,10 +743,11 @@ #if defined (HAVE_TM_GMTOFF) && defined (HAVE_STRUCT_TM_TM_ZONE) long tz_off; const char *rest; - time_t stamp = gaim_str_to_time(gaim_unescape_filename(thetimestamp), FALSE, &tm, &tz_off, &rest); + time_t stamp; char *end; thetimestamp = (thetimestamp != NULL) ? thetimestamp + sizeof(gchar) : filename; + stamp = gaim_str_to_time(gaim_unescape_filename(thetimestamp), FALSE, &tm, &tz_off, &rest); /* As zero is a valid offset, GAIM_NO_TZ_OFF means no offset was * provided. See util.h. Yes, it's kinda ugly. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-06-11 21:48:47
|
Revision: 16260 Author: roast Date: 2006-06-11 14:48:41 -0700 (Sun, 11 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16260&view=rev Log Message: ----------- added support for gaim:message.self for conversations that are with yourself Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-11 19:28:26 UTC (rev 16259) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-11 21:48:41 UTC (rev 16260) @@ -1029,10 +1029,26 @@ written += fprintf(data->file, "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"whisper\">%s</message>\n", date, from, msg_fixed); } else if (type & GAIM_MESSAGE_AUTO_RESP && (type & GAIM_MESSAGE_SEND || type & GAIM_MESSAGE_RECV)) { - written += fprintf(data->file, "\t<message time=\"%s\" sender=\"%s\" auto=\"true\">%s</message>\n", date, from, msg_fixed); + gboolean selfsending = FALSE; + if (!g_ascii_strncasecmp(gaim_account_get_username(log->account), + gaim_account_get_username(log->conv->account), + strlen(gaim_account_get_username(log->account)))) { + selfsending = (type & GAIM_MESSAGE_RECV); + } + + written += fprintf(data->file, "\t<message time=\"%s\" sender=\"%s\"%s auto=\"true\">%s</message>\n", + date, from, selfsending ? " gaim:self=\"true\"" : "", msg_fixed); } else if (type & GAIM_MESSAGE_SEND || type & GAIM_MESSAGE_RECV) { - written += fprintf(data->file, "\t<message time=\"%s\" sender=\"%s\">%s</message>\n", date, from, msg_fixed); + gboolean selfsending = FALSE; + if (!g_ascii_strncasecmp(gaim_account_get_username(log->account), + gaim_account_get_username(log->conv->account), + strlen(gaim_account_get_username(log->account)))) { + selfsending = (type & GAIM_MESSAGE_RECV); + } + + written += fprintf(data->file, "\t<message time=\"%s\" sender=\"%s\"%s>%s</message>\n", + date, from, selfsending ? " gaim:self=\"true\"" : "", msg_fixed); } else { gaim_debug_error("log", "Unhandled message type."); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-06-16 03:06:35
|
Revision: 16265 Author: roast Date: 2006-06-15 20:06:31 -0700 (Thu, 15 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16265&view=rev Log Message: ----------- corrected the closing tag in the ULF logger Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-15 01:51:10 UTC (rev 16264) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-16 03:06:31 UTC (rev 16265) @@ -1071,7 +1071,7 @@ if (data->file) { const char *date = gaim_utf8_strftime("%F %T%z", localtime(NULL)); fprintf(data->file, "\t<event time=\"%s\" type=\"logEnd\" />\n", date); - fprintf(data->file, "</conversation>\n"); + fprintf(data->file, "</chat>\n"); fclose(data->file); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-06-16 03:24:49
|
Revision: 16267 Author: roast Date: 2006-06-15 20:24:46 -0700 (Thu, 15 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16267&view=rev Log Message: ----------- xml logger can now read the stuff it writes. no event support yet. Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-16 03:24:25 UTC (rev 16266) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-16 03:24:46 UTC (rev 16267) @@ -52,7 +52,7 @@ static void xml_logger_finalize(GaimLog *log); static GList *xml_logger_list(GaimLogType type, const char *sn, GaimAccount *account); static GList *xml_logger_list_syslog(GaimAccount *account); -//static char *xml_logger_read(GaimLog *log, GaimLogReadFlags *flags); +static char *xml_logger_read(GaimLog *log, GaimLogReadFlags *flags); static int xml_logger_total_size(GaimLogType type, const char *name, GaimAccount *account); static gsize html_logger_write(GaimLog *log, GaimMessageFlags type, @@ -572,7 +572,7 @@ xml_logger_write, xml_logger_finalize, xml_logger_list, - txt_logger_read, + xml_logger_read, gaim_log_common_sizer, xml_logger_total_size, xml_logger_list_syslog); @@ -1086,8 +1086,25 @@ return gaim_log_common_lister(type, sn, account, ".chatlog", xml_logger); } -// xml_logger_Read +static char *xml_logger_read(GaimLog *log, GaimLogReadFlags *flags) +{ + char *read; + GaimLogCommonLoggerData *data = log->logger_data; + *flags = GAIM_LOG_READ_NO_NEWLINE; + if (!data || !data->path) + return g_strdup(_("<font color=\"red\"><b>Unable to find log path!</b></font>")); + if (g_file_get_contents(data->path, &read, NULL, NULL)) { + gboolean bad_formatting; + char *processed; + bad_formatting = gaim_ufl_to_xhtml(read, &processed); + + return processed; + } + return g_strdup_printf(_("<font color=\"red\"><b>Could not read file: %s</b></font>"), data->path); + +} + static int xml_logger_total_size(GaimLogType type, const char *name, GaimAccount *account) { return gaim_log_common_total_sizer(type, name, account, ".chatlog"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-06-18 20:13:07
|
Revision: 16275 Author: roast Date: 2006-06-18 13:12:53 -0700 (Sun, 18 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16275&view=rev Log Message: ----------- xml logger flushes a well-formed xml file Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-18 02:03:08 UTC (rev 16274) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-18 20:12:53 UTC (rev 16275) @@ -1056,11 +1056,21 @@ } g_free(msg_fixed); - fflush(data->file); - // TODO: haven't written end of file and seeked back - // TODO: this is to keep a valid XML document out of the user space buffer + // append suffix to file and seek back to keep a valid XML document out of the user space buffer + { + int tail = 0; + const char *date = gaim_utf8_strftime("%F %T%z", localtime(NULL)); + tail += fprintf(data->file, "\t<event time=\"%s\" type=\"logEnd\" />\n", date); + tail += fprintf(data->file, "</chat>\n"); + + if (fseek(data->file, -1*tail, SEEK_CUR) != 0) { + gaim_debug_error("log", "Could not seek backwards in logfile."); + } + } + + fflush(data->file); return written; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-06-18 20:19:55
|
Revision: 16276 Author: roast Date: 2006-06-18 13:19:51 -0700 (Sun, 18 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16276&view=rev Log Message: ----------- GaimLogCommonData.path gets set in gaim_log_common_writer now Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-18 20:12:53 UTC (rev 16275) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-18 20:19:51 UTC (rev 16276) @@ -702,7 +702,7 @@ if (log->conv != NULL) gaim_conversation_write(log->conv, NULL, _("Logging of this conversation failed."), GAIM_MESSAGE_ERROR, time(NULL)); - + data->path = g_strndup(path, strlen(path)); g_free(path); return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-06-18 20:21:48
|
Revision: 16277 Author: roast Date: 2006-06-18 13:21:42 -0700 (Sun, 18 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16277&view=rev Log Message: ----------- GaimLogCommonData.path gets set in gaim_log_common_writer now; last commit put it in the wrong place Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-18 20:19:51 UTC (rev 16276) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-18 20:21:42 UTC (rev 16277) @@ -702,10 +702,11 @@ if (log->conv != NULL) gaim_conversation_write(log->conv, NULL, _("Logging of this conversation failed."), GAIM_MESSAGE_ERROR, time(NULL)); - data->path = g_strndup(path, strlen(path)); g_free(path); return; } + + data->path = g_strndup(path, strlen(path)); g_free(path); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-06-18 22:46:38
|
Revision: 16278 Author: roast Date: 2006-06-18 15:46:32 -0700 (Sun, 18 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16278&view=rev Log Message: ----------- logging now truncates and writes logfiles; added code to eliminate collisions. Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-18 20:21:42 UTC (rev 16277) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-18 22:46:32 UTC (rev 16278) @@ -687,13 +687,37 @@ date, tz, ext ? ext : ""); path = g_build_filename(dir, filename, NULL); - g_free(tz); - g_free(dir); g_free(filename); + /* since we're truncating now, test if file exists. if so, append ".[a-z]" to filename and stop */ + if (g_file_test(path, G_FILE_TEST_EXISTS)) { + char suffixchar = 'a'; + + do { + g_free(path); + filename = g_strdup_printf("%s_%s%s.%c%s", + gaim_escape_filename(gaim_normalize(log->account, log->name)), + date, tz, suffixchar, ext ? ext : ""); + path = g_build_filename(dir, filename, NULL); + g_free(filename); + + suffixchar++; + } while (g_file_test(path, G_FILE_TEST_EXISTS) && suffixchar <= 'z'); + + if (suffixchar == 'z' && g_file_test(path, G_FILE_TEST_EXISTS)) { + /* we have a collision problem. not logging, and complain. */ + gaim_conversation_write(log->conv, NULL, _("Logging of this conversation failed."), + GAIM_MESSAGE_ERROR, time(NULL)); + g_free(tz); + g_free(dir); + g_free(path); + return; + } + } + log->logger_data = data = g_slice_new0(GaimLogCommonLoggerData); - data->file = g_fopen(path, "a"); + data->file = g_fopen(path, "w+"); if (data->file == NULL) { gaim_debug(GAIM_DEBUG_ERROR, "log", @@ -702,6 +726,8 @@ if (log->conv != NULL) gaim_conversation_write(log->conv, NULL, _("Logging of this conversation failed."), GAIM_MESSAGE_ERROR, time(NULL)); + g_free(tz); + g_free(dir); g_free(path); return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-06-25 19:05:18
|
Revision: 16336 Author: rlaager Date: 2006-06-25 12:05:11 -0700 (Sun, 25 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16336&view=rev Log Message: ----------- Avoid calling gaim_utf8_strftime() multiple times. Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-06-25 03:15:41 UTC (rev 16335) +++ branches/soc-2006-file-loggers/src/log.c 2006-06-25 19:05:11 UTC (rev 16336) @@ -1002,7 +1002,7 @@ const char *from, time_t time, const char *message) { char *msg_fixed; - const char *date = gaim_utf8_strftime("%F %T%z", localtime(&time)); + char *date = g_strdup(gaim_utf8_strftime("%F %T%z", localtime(&time))); GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); GaimLogCommonLoggerData *data = log->logger_data; @@ -1022,10 +1022,6 @@ // if file doesn't exist, die if (!data->file) return 0; - // because gaim_utf8_strftime returns a pointer to static data, - // and was called in gaim_log_common_writer - date = gaim_utf8_strftime("%F %T%z", localtime(&time)); - fprintf(data->file, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); if (log->type == GAIM_LOG_SYSTEM) @@ -1097,6 +1093,7 @@ } } + g_free(date); fflush(data->file); return written; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-02 18:33:19
|
Revision: 16397 Author: roast Date: 2006-07-02 11:33:13 -0700 (Sun, 02 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16397&view=rev Log Message: ----------- wingaim port fixes: localtime(NULL) crashes windows; %F/%T are linux specific. Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-02 16:02:29 UTC (rev 16396) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-02 18:33:13 UTC (rev 16397) @@ -1003,7 +1003,7 @@ const char *from, time_t time, const char *message) { char *msg_fixed; - char *date = g_strdup(gaim_utf8_strftime("%F %T%z", localtime(&time))); + char *date = g_strdup(gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", localtime(&time))); GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); GaimLogCommonLoggerData *data = log->logger_data; @@ -1084,7 +1084,7 @@ // append suffix to file and seek back to keep a valid XML document out of the user space buffer { int tail = 0; - const char *date = gaim_utf8_strftime("%F %T%z", localtime(NULL)); + const char *date = gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", NULL); tail += fprintf(data->file, "\t<event time=\"%s\" type=\"logEnd\" />\n", date); tail += fprintf(data->file, "</chat>\n"); @@ -1104,7 +1104,7 @@ GaimLogCommonLoggerData *data = log->logger_data; if (data) { if (data->file) { - const char *date = gaim_utf8_strftime("%F %T%z", localtime(NULL)); + const char *date = gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", NULL); fprintf(data->file, "\t<event time=\"%s\" type=\"logEnd\" />\n", date); fprintf(data->file, "</chat>\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-02 19:34:25
|
Revision: 16398 Author: roast Date: 2006-07-02 12:34:04 -0700 (Sun, 02 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16398&view=rev Log Message: ----------- file stream rewinding changed. counting written characters from fprintf doesn't count the \r's on windows. Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-02 18:33:13 UTC (rev 16397) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-02 19:34:04 UTC (rev 16398) @@ -1083,14 +1083,19 @@ // append suffix to file and seek back to keep a valid XML document out of the user space buffer { - int tail = 0; + fpos_t tail; const char *date = gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", NULL); - tail += fprintf(data->file, "\t<event time=\"%s\" type=\"logEnd\" />\n", date); - tail += fprintf(data->file, "</chat>\n"); + if (fgetpos(data->file, &tail) != 0) { + gaim_debug_error("log", "Could not save logfile stream position. Not writing tail."); + } + else { + fprintf(data->file, "\t<event time=\"%s\" type=\"logEnd\" />\n", date); + fprintf(data->file, "</chat>\n"); - if (fseek(data->file, -1*tail, SEEK_CUR) != 0) { - gaim_debug_error("log", "Could not seek backwards in logfile."); + if (fsetpos(data->file, &tail) != 0) { + gaim_debug_error("log", "Could not return logfile strem position after tail write."); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-02 21:13:00
|
Revision: 16399 Author: roast Date: 2006-07-02 14:12:54 -0700 (Sun, 02 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16399&view=rev Log Message: ----------- log creation now calls gaim_escape_filename fewer times; extra strings facilitates Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-02 19:34:04 UTC (rev 16398) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-02 21:12:54 UTC (rev 16399) @@ -666,8 +666,8 @@ /* This log is new */ char *dir; struct tm *tm; - char *tz; - const char *date; + char *basename; + char *extname; char *filename; char *path; @@ -677,16 +677,19 @@ gaim_build_dir (dir, S_IRUSR | S_IWUSR | S_IXUSR); - // roast: tz must be strdup'd. gaim_escape_filename returns a pointer to static data, - // and I need it for escaping remote_user's name for the filename below tm = localtime(&log->time); - tz = g_strdup(gaim_escape_filename(gaim_utf8_strftime("%Z", tm))); - date = gaim_utf8_strftime("%Y-%m-%dT%H%M%S%z", tm); - filename = g_strdup_printf("%s_%s%s%s", - gaim_escape_filename(gaim_normalize(log->account, log->name)), - date, tz, ext ? ext : ""); + { // build basename + char * temp = g_strdup_printf("%s_%s", gaim_normalize(log->account, log->name), + gaim_utf8_strftime("%Y-%m-%dT%H%M%S%z%Z", tm)); + basename = g_strdup(gaim_escape_filename(temp)); + g_free(temp); + } + extname = g_strdup(gaim_escape_filename(ext)); + + filename = g_strdup_printf("%s%s", basename, extname ? extname : ""); + path = g_build_filename(dir, filename, NULL); g_free(filename); @@ -696,9 +699,7 @@ do { g_free(path); - filename = g_strdup_printf("%s_%s%s.%c%s", - gaim_escape_filename(gaim_normalize(log->account, log->name)), - date, tz, suffixchar, ext ? ext : ""); + filename = g_strdup_printf("%s%c%s", basename, suffixchar, extname ? extname : ""); path = g_build_filename(dir, filename, NULL); g_free(filename); @@ -709,9 +710,10 @@ /* we have a collision problem. not logging, and complain. */ gaim_conversation_write(log->conv, NULL, _("Logging of this conversation failed."), GAIM_MESSAGE_ERROR, time(NULL)); - g_free(tz); g_free(dir); g_free(path); + g_free(extname); + g_free(basename); return; } } @@ -727,14 +729,18 @@ if (log->conv != NULL) gaim_conversation_write(log->conv, NULL, _("Logging of this conversation failed."), GAIM_MESSAGE_ERROR, time(NULL)); - g_free(tz); g_free(dir); g_free(path); + g_free(extname); + g_free(basename); return; } data->path = g_strndup(path, strlen(path)); + g_free(dir); g_free(path); + g_free(extname); + g_free(basename); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-02 22:58:35
|
Revision: 16403 Author: roast Date: 2006-07-02 15:58:30 -0700 (Sun, 02 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16403&view=rev Log Message: ----------- receiving a message from self detection fixed. normalizing all names; making no assumptions. Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-02 22:13:06 UTC (rev 16402) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-02 22:58:30 UTC (rev 16403) @@ -1059,26 +1059,34 @@ written += fprintf(data->file, "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"whisper\">%s</message>\n", date, from, msg_fixed); } else if (type & GAIM_MESSAGE_AUTO_RESP && (type & GAIM_MESSAGE_SEND || type & GAIM_MESSAGE_RECV)) { - gboolean selfsending = FALSE; - if (!g_ascii_strncasecmp(gaim_account_get_username(log->account), - gaim_account_get_username(log->conv->account), - strlen(gaim_account_get_username(log->account)))) { - selfsending = (type & GAIM_MESSAGE_RECV); + gboolean recv_from_self = FALSE; + if (type & GAIM_MESSAGE_RECV) { + char *from_normed = g_strdup(gaim_normalize(log->account, from)); + if (g_ascii_strncasecmp(from_normed, + gaim_normalize(log->account, gaim_account_get_username(log->account)), + strlen(from)) == 0) { + recv_from_self = TRUE; + g_free(from_normed); + } } written += fprintf(data->file, "\t<message time=\"%s\" sender=\"%s\"%s auto=\"true\">%s</message>\n", - date, from, selfsending ? " gaim:self=\"true\"" : "", msg_fixed); + date, from, recv_from_self ? " gaim:self=\"true\"" : "", msg_fixed); } else if (type & GAIM_MESSAGE_SEND || type & GAIM_MESSAGE_RECV) { - gboolean selfsending = FALSE; - if (!g_ascii_strncasecmp(gaim_account_get_username(log->account), - gaim_account_get_username(log->conv->account), - strlen(gaim_account_get_username(log->account)))) { - selfsending = (type & GAIM_MESSAGE_RECV); + gboolean recv_from_self = FALSE; + if (type & GAIM_MESSAGE_RECV) { + char *from_normed = g_strdup(gaim_normalize(log->account, from)); + if (g_ascii_strncasecmp(from_normed, + gaim_normalize(log->account, gaim_account_get_username(log->account)), + strlen(from)) == 0) { + recv_from_self = TRUE; + g_free(from_normed); + } } written += fprintf(data->file, "\t<message time=\"%s\" sender=\"%s\"%s>%s</message>\n", - date, from, selfsending ? " gaim:self=\"true\"" : "", msg_fixed); + date, from, recv_from_self ? " gaim:self=\"true\"" : "", msg_fixed); } else { gaim_debug_error("log", "Unhandled message type."); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-04 22:13:07
|
Revision: 16422 Author: roast Date: 2006-07-04 15:12:58 -0700 (Tue, 04 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16422&view=rev Log Message: ----------- xml_logger's giochannel calls now nicely report errors Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-04 18:49:13 UTC (rev 16421) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:12:58 UTC (rev 16422) @@ -1046,6 +1046,12 @@ log->type == GAIM_LOG_SYSTEM ? "gaim:logtype=\"system\"" : "", date); iostat = g_io_channel_write_chars(data->channel, writebuf, -1, &written_buf, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "xml_logger_write could not write to new file: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + written += written_buf; } @@ -1103,6 +1109,11 @@ } iostat = g_io_channel_write_chars(data->channel, writebuf, -1, &written_buf, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "xml_logger_write could not the message to the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } written += written_buf; g_free(date); @@ -1115,11 +1126,25 @@ gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", NULL)); iostat = g_io_channel_write_chars(data->channel, writebuf, -1, &written_buf, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "xml_logger_write could not write the tail to the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + iostat = g_io_channel_seek_position(data->channel, -1*(gint64)(written_buf), G_SEEK_CUR, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "xml_logger_write could not seek backwards to the beginning of the tail: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } - //gaim_debug_error("log", "Could not return logfile stream position after tail write."); - iostat = g_io_channel_flush(data->channel, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "xml_logger_write could not flush the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } return written; } @@ -1139,8 +1164,20 @@ gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", NULL)); iostat = g_io_channel_write_chars(data->channel, writebuf, -1, NULL, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "xml_logger_finalize could not write the tail: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } iostat = g_io_channel_shutdown(data->channel, TRUE, &gerror); // this may cause hanging + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "xml_logger_finalize could not shutdown the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + + } g_free(data->path); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-04 22:22:49
|
Revision: 16423 Author: roast Date: 2006-07-04 15:22:45 -0700 (Tue, 04 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16423&view=rev Log Message: ----------- using GString to build write buffer instead of a static 2048byte block Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:12:58 UTC (rev 16422) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:22:45 UTC (rev 16423) @@ -1020,10 +1020,12 @@ GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); GaimLogCommonLoggerData *data = log->logger_data; gsize written = 0, written_buf = 0; - char writebuf[4096]; + GString *writebuf; GIOStatus iostat; GError *gerror = NULL; + writebuf = g_string_new(""); + /* This log is new. We could use the loggers 'new' function, but * creating a new file there would result in empty files in the case * that you open a convo with someone, but don't say anything. @@ -1038,14 +1040,14 @@ // if file doesn't exist, die if (!data->channel) return 0; - g_snprintf(writebuf, sizeof(writebuf), - "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" - "<chat service=\"%s\" account=\"%s\" version=\"0.3.1-04\"%s>\n" - "\t<event time=\"%s\" type=\"logStart\" />\n", - prpl, gaim_account_get_username(log->account), - log->type == GAIM_LOG_SYSTEM ? "gaim:logtype=\"system\"" : "", date); + g_string_printf(writebuf, + "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + "<chat service=\"%s\" account=\"%s\" version=\"0.3.1-04\"%s>\n" + "\t<event time=\"%s\" type=\"logStart\" />\n", + prpl, gaim_account_get_username(log->account), + log->type == GAIM_LOG_SYSTEM ? "gaim:logtype=\"system\"" : "", date); - iostat = g_io_channel_write_chars(data->channel, writebuf, -1, &written_buf, &gerror); + iostat = g_io_channel_write_chars(data->channel, writebuf->str, -1, &written_buf, &gerror); if (iostat == G_IO_STATUS_ERROR) { gaim_debug_info("log", "xml_logger_write could not write to new file: %s\n", gerror->message); g_error_free(gerror); @@ -1062,16 +1064,16 @@ gaim_markup_html_to_xhtml(message, &msg_fixed, NULL); if (log->type == GAIM_LOG_SYSTEM) { - g_snprintf(writebuf, sizeof(writebuf), "\t<event time=\"%s\" sender=\"%s\" gaim:type=\"system\">%s</event>\n", date, from, msg_fixed); + g_string_printf(writebuf, "\t<event time=\"%s\" sender=\"%s\" gaim:type=\"system\">%s</event>\n", date, from, msg_fixed); } else if (type & GAIM_MESSAGE_SYSTEM) { - g_snprintf(writebuf, sizeof(writebuf), "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"system\">%s</message>\n", date, from, msg_fixed); + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"system\">%s</message>\n", date, from, msg_fixed); } else if (type & GAIM_MESSAGE_ERROR) { - g_snprintf(writebuf, sizeof(writebuf), "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"error\">%s</message>\n", date, from, msg_fixed); + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"error\">%s</message>\n", date, from, msg_fixed); } else if (type & GAIM_MESSAGE_WHISPER) { - g_snprintf(writebuf, sizeof(writebuf), "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"whisper\">%s</message>\n", date, from, msg_fixed); + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"whisper\">%s</message>\n", date, from, msg_fixed); } else if (type & GAIM_MESSAGE_AUTO_RESP && (type & GAIM_MESSAGE_SEND || type & GAIM_MESSAGE_RECV)) { gboolean recv_from_self = FALSE; @@ -1085,8 +1087,8 @@ } } - g_snprintf(writebuf, sizeof(writebuf), "\t<message time=\"%s\" sender=\"%s\"%s auto=\"true\">%s</message>\n", - date, from, recv_from_self ? " gaim:self=\"true\"" : "", msg_fixed); + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\"%s auto=\"true\">%s</message>\n", + date, from, recv_from_self ? " gaim:self=\"true\"" : "", msg_fixed); } else if (type & GAIM_MESSAGE_SEND || type & GAIM_MESSAGE_RECV) { gboolean recv_from_self = FALSE; @@ -1100,15 +1102,15 @@ } } - g_snprintf(writebuf, sizeof(writebuf), "\t<message time=\"%s\" sender=\"%s\"%s>%s</message>\n", + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\"%s>%s</message>\n", date, from, recv_from_self ? " gaim:self=\"true\"" : "", msg_fixed); } else { gaim_debug_error("log", "Unhandled message type."); - g_snprintf(writebuf, sizeof(writebuf), "\t<message time=\"%s\" sender=\"%s\">%s</message>\n", date, from, msg_fixed); + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\">%s</message>\n", date, from, msg_fixed); } - iostat = g_io_channel_write_chars(data->channel, writebuf, -1, &written_buf, &gerror); + iostat = g_io_channel_write_chars(data->channel, writebuf->str, -1, &written_buf, &gerror); if (iostat == G_IO_STATUS_ERROR) { gaim_debug_info("log", "xml_logger_write could not the message to the logfile: %s\n", gerror->message); g_error_free(gerror); @@ -1120,12 +1122,12 @@ g_free(msg_fixed); // append suffix to file and seek back to keep a valid XML document out of the user space buffer - g_snprintf(writebuf, sizeof(writebuf), - "\t<event time=\"%s\" type=\"logEnd\" />\n" - "</chat>\n", - gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", NULL)); + g_string_printf(writebuf, + "\t<event time=\"%s\" type=\"logEnd\" />\n" + "</chat>\n", + gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", NULL)); - iostat = g_io_channel_write_chars(data->channel, writebuf, -1, &written_buf, &gerror); + iostat = g_io_channel_write_chars(data->channel, writebuf->str, -1, &written_buf, &gerror); if (iostat == G_IO_STATUS_ERROR) { gaim_debug_info("log", "xml_logger_write could not write the tail to the logfile: %s\n", gerror->message); g_error_free(gerror); @@ -1152,18 +1154,21 @@ static void xml_logger_finalize(GaimLog *log) { GaimLogCommonLoggerData *data = log->logger_data; + if (data) { if (data->channel) { - char writebuf[256]; + GString *writebuf; GIOStatus iostat; GError *gerror = NULL; - g_snprintf(writebuf, sizeof(writebuf), - "\t<event time=\"%s\" type=\"logEnd\" />\n" - "</chat>\n", - gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", NULL)); + writebuf = g_string_new(""); - iostat = g_io_channel_write_chars(data->channel, writebuf, -1, NULL, &gerror); + g_string_printf(writebuf, + "\t<event time=\"%s\" type=\"logEnd\" />\n" + "</chat>\n", + gaim_utf8_strftime("%Y-%m-%d %H:%M:%S%z", NULL)); + + iostat = g_io_channel_write_chars(data->channel, writebuf->str, -1, NULL, &gerror); if (iostat == G_IO_STATUS_ERROR) { gaim_debug_info("log", "xml_logger_finalize could not write the tail: %s\n", gerror->message); g_error_free(gerror); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-04 22:32:13
|
Revision: 16424 Author: roast Date: 2006-07-04 15:32:05 -0700 (Tue, 04 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16424&view=rev Log Message: ----------- free the GString too Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:22:45 UTC (rev 16423) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:32:05 UTC (rev 16424) @@ -1148,6 +1148,7 @@ gerror = NULL; } + g_string_free(writebuf, TRUE); return written; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-04 22:45:54
|
Revision: 16425 Author: roast Date: 2006-07-04 15:45:48 -0700 (Tue, 04 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16425&view=rev Log Message: ----------- html_logger now writes using giochannel Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:32:05 UTC (rev 16424) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:45:48 UTC (rev 16425) @@ -720,7 +720,7 @@ log->logger_data = data = g_slice_new0(GaimLogCommonLoggerData); - if (current_logger == xml_logger) { + if (current_logger == xml_logger || current_logger == html_logger) { data->channel = g_io_channel_new_file(path, "w+", NULL); } else { @@ -1234,87 +1234,112 @@ { char *msg_fixed; char *date; - char *header; GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); GaimLogCommonLoggerData *data = log->logger_data; - gsize written = 0; + gsize written = 0, written_buf = 0; + GString *writebuf = g_string_new(""); + GIOStatus iostat; + GError *gerror = NULL; if(!data) { const char *prpl = GAIM_PLUGIN_PROTOCOL_INFO(plugin)->list_icon(log->account, NULL); const char *date; + char *header; + gaim_log_common_writer(log, ".html"); data = log->logger_data; /* if we can't write to the file, give up before we hurt ourselves */ - if(!data->file) + if(!data->channel) return 0; date = gaim_date_format_full(localtime(&log->time)); - written += fprintf(data->file, "<html><head>"); - written += fprintf(data->file, "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">"); - written += fprintf(data->file, "<title>"); + g_string_printf(writebuf, + "<html><head>" + "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">" + "<title>"); + if (log->type == GAIM_LOG_SYSTEM) header = g_strdup_printf("System log for account %s (%s) connected at %s", gaim_account_get_username(log->account), prpl, date); else header = g_strdup_printf("Conversation with %s at %s on %s (%s)", - log->name, date, gaim_account_get_username(log->account), prpl); + log->name, date, gaim_account_get_username(log->account), prpl); - written += fprintf(data->file, "%s", header); - written += fprintf(data->file, "</title></head><body>"); - written += fprintf(data->file, "<h3>%s</h3>\n", header); + g_string_append_printf(writebuf, "%s" "</title></head><body>" "<h3>%s</h3>\n", header, header); g_free(header); + + iostat = g_io_channel_write_chars(data->channel, writebuf->str, -1, &written_buf, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "html_logger_write could not write to a new file: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + written += written_buf; } /* if we can't write to the file, give up before we hurt ourselves */ - if(!data->file) + if(!data->channel) return 0; gaim_markup_html_to_xhtml(message, &msg_fixed, NULL); date = log_get_timestamp(log, time); if(log->type == GAIM_LOG_SYSTEM){ - written += fprintf(data->file, "---- %s @ %s ----<br/>\n", msg_fixed, date); + g_string_printf(writebuf, "---- %s @ %s ----<br/>\n", msg_fixed, date); + } else if (type & GAIM_MESSAGE_SYSTEM) + g_string_printf(writebuf, "<font size=\"2\">(%s)</font><b> %s</b><br/>\n", date, msg_fixed); + else if (type & GAIM_MESSAGE_ERROR) + g_string_printf(writebuf, "<font color=\"#FF0000\"><font size=\"2\">(%s)</font><b> %s</b></font><br/>\n", date, msg_fixed); + else if (type & GAIM_MESSAGE_WHISPER) + g_string_printf(writebuf, "<font color=\"#6C2585\"><font size=\"2\">(%s)</font><b> %s:</b></font> %s<br/>\n", + date, from, msg_fixed); + else if (type & GAIM_MESSAGE_AUTO_RESP) { + if (type & GAIM_MESSAGE_SEND) + g_string_printf(writebuf, _("<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); + else if (type & GAIM_MESSAGE_RECV) + g_string_printf(writebuf, _("<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); + } else if (type & GAIM_MESSAGE_RECV) { + if(gaim_message_meify(msg_fixed, -1)) + g_string_printf(writebuf, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", + date, from, msg_fixed); + else + g_string_printf(writebuf, "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", + date, from, msg_fixed); + } else if (type & GAIM_MESSAGE_SEND) { + if(gaim_message_meify(msg_fixed, -1)) + g_string_printf(writebuf, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", + date, from, msg_fixed); + else + g_string_printf(writebuf, "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", + date, from, msg_fixed); } else { - if (type & GAIM_MESSAGE_SYSTEM) - written += fprintf(data->file, "<font size=\"2\">(%s)</font><b> %s</b><br/>\n", date, msg_fixed); - else if (type & GAIM_MESSAGE_ERROR) - written += fprintf(data->file, "<font color=\"#FF0000\"><font size=\"2\">(%s)</font><b> %s</b></font><br/>\n", date, msg_fixed); - else if (type & GAIM_MESSAGE_WHISPER) - written += fprintf(data->file, "<font color=\"#6C2585\"><font size=\"2\">(%s)</font><b> %s:</b></font> %s<br/>\n", - date, from, msg_fixed); - else if (type & GAIM_MESSAGE_AUTO_RESP) { - if (type & GAIM_MESSAGE_SEND) - written += fprintf(data->file, _("<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); - else if (type & GAIM_MESSAGE_RECV) - written += fprintf(data->file, _("<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); - } else if (type & GAIM_MESSAGE_RECV) { - if(gaim_message_meify(msg_fixed, -1)) - written += fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", - date, from, msg_fixed); - else - written += fprintf(data->file, "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", - date, from, msg_fixed); - } else if (type & GAIM_MESSAGE_SEND) { - if(gaim_message_meify(msg_fixed, -1)) - written += fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", - date, from, msg_fixed); - else - written += fprintf(data->file, "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", - date, from, msg_fixed); - } else { - gaim_debug_error("log", "Unhandled message type."); - written += fprintf(data->file, "<font size=\"2\">(%s)</font><b> %s:</b></font> %s<br/>\n", - date, from, msg_fixed); - } + gaim_debug_error("log", "Unhandled message type."); + g_string_printf(writebuf, "<font size=\"2\">(%s)</font><b> %s:</b></font> %s<br/>\n", + date, from, msg_fixed); } g_free(date); g_free(msg_fixed); - fflush(data->file); + iostat = g_io_channel_write_chars(data->channel, writebuf->str, -1, &written_buf, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "html_logger_write could not write the message to the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + written += written_buf; + + iostat = g_io_channel_flush(data->channel, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "xml_logger_write could not flush the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + + g_string_free(writebuf, TRUE); return written; } @@ -1322,9 +1347,24 @@ { GaimLogCommonLoggerData *data = log->logger_data; if (data) { - if(data->file) { - fprintf(data->file, "</body></html>\n"); - fclose(data->file); + if(data->channel) { + GIOStatus iostat; + GError *gerror = NULL; + + iostat = g_io_channel_write_chars(data->channel, "</body></html>\n", -1, NULL, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "html_logger_finalize could not write the tail: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + + iostat = g_io_channel_shutdown(data->channel, TRUE, &gerror); // this may cause hanging + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "html_logger_finalize could not shutdown the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + } g_free(data->path); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-04 22:51:48
|
Revision: 16426 Author: roast Date: 2006-07-04 15:51:43 -0700 (Tue, 04 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16426&view=rev Log Message: ----------- cosmetic change in html_logger, and add the written buffer length only if giochannel operation didn't fail Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:45:48 UTC (rev 16425) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:51:43 UTC (rev 16426) @@ -1053,8 +1053,7 @@ g_error_free(gerror); gerror = NULL; } - - written += written_buf; + else written += written_buf; } /* if we can't write to the file, give up before we hurt ourselves */ @@ -1116,7 +1115,7 @@ g_error_free(gerror); gerror = NULL; } - written += written_buf; + else written += written_buf; g_free(date); g_free(msg_fixed); @@ -1278,7 +1277,7 @@ g_error_free(gerror); gerror = NULL; } - written += written_buf; + else written += written_buf; } /* if we can't write to the file, give up before we hurt ourselves */ @@ -1288,9 +1287,9 @@ gaim_markup_html_to_xhtml(message, &msg_fixed, NULL); date = log_get_timestamp(log, time); - if(log->type == GAIM_LOG_SYSTEM){ + if(log->type == GAIM_LOG_SYSTEM) g_string_printf(writebuf, "---- %s @ %s ----<br/>\n", msg_fixed, date); - } else if (type & GAIM_MESSAGE_SYSTEM) + else if (type & GAIM_MESSAGE_SYSTEM) g_string_printf(writebuf, "<font size=\"2\">(%s)</font><b> %s</b><br/>\n", date, msg_fixed); else if (type & GAIM_MESSAGE_ERROR) g_string_printf(writebuf, "<font color=\"#FF0000\"><font size=\"2\">(%s)</font><b> %s</b></font><br/>\n", date, msg_fixed); @@ -1330,7 +1329,7 @@ g_error_free(gerror); gerror = NULL; } - written += written_buf; + else written += written_buf; iostat = g_io_channel_flush(data->channel, &gerror); if (iostat == G_IO_STATUS_ERROR) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-04 23:14:38
|
Revision: 16427 Author: roast Date: 2006-07-04 16:14:32 -0700 (Tue, 04 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16427&view=rev Log Message: ----------- txt_logger now uses giochannels too; txt_logger_writer bug now frees all data when it prematurely exists; removed gaim_common_log_writer's compensating checking Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-04 22:51:43 UTC (rev 16426) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-04 23:14:32 UTC (rev 16427) @@ -720,15 +720,9 @@ log->logger_data = data = g_slice_new0(GaimLogCommonLoggerData); - if (current_logger == xml_logger || current_logger == html_logger) { - data->channel = g_io_channel_new_file(path, "w+", NULL); - } - else { - data->file = g_fopen(path, "w+"); - } + data->channel = g_io_channel_new_file(path, "w+", NULL); - // they can't be /both/ null - if (data->channel == NULL && data->file == NULL) { + if (data->channel == NULL) { gaim_debug(GAIM_DEBUG_ERROR, "log", "Could not create log file %s\n", path); @@ -1420,9 +1414,11 @@ GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); GaimLogCommonLoggerData *data = log->logger_data; char *stripped = NULL; + gsize written = 0, written_buf = 0; + GString *writebuf = g_string_new(""); + GIOStatus iostat; + GError *gerror = NULL; - gsize written = 0; - if (data == NULL) { /* This log is new. We could use the loggers 'new' function, but * creating a new file there would result in empty files in the case @@ -1435,58 +1431,75 @@ data = log->logger_data; /* if we can't write to the file, give up before we hurt ourselves */ - if(!data->file) + if(!data->channel) return 0; if (log->type == GAIM_LOG_SYSTEM) - written += fprintf(data->file, "System log for account %s (%s) connected at %s\n", - gaim_account_get_username(log->account), prpl, - gaim_date_format_full(localtime(&log->time))); + g_string_printf(writebuf, "System log for account %s (%s) connected at %s\n", + gaim_account_get_username(log->account), prpl, + gaim_date_format_full(localtime(&log->time))); else - written += fprintf(data->file, "Conversation with %s at %s on %s (%s)\n", - log->name, gaim_date_format_full(localtime(&log->time)), - gaim_account_get_username(log->account), prpl); + g_string_printf(writebuf, "Conversation with %s at %s on %s (%s)\n", + log->name, gaim_date_format_full(localtime(&log->time)), + gaim_account_get_username(log->account), prpl); + + iostat = g_io_channel_write_chars(data->channel, writebuf->str, -1, &written_buf, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "html_logger_write could not write to a new file: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + else written += written_buf; } /* if we can't write to the file, give up before we hurt ourselves */ - if(!data->file) + if(!data->channel) return 0; stripped = gaim_markup_strip_html(message); date = log_get_timestamp(log, time); if(log->type == GAIM_LOG_SYSTEM){ - written += fprintf(data->file, "---- %s @ %s ----\n", stripped, date); - } else { - if (type & GAIM_MESSAGE_SEND || - type & GAIM_MESSAGE_RECV) { - if (type & GAIM_MESSAGE_AUTO_RESP) { - written += fprintf(data->file, _("(%s) %s <AUTO-REPLY>: %s\n"), date, - from, stripped); - } else { - if(gaim_message_meify(stripped, -1)) - written += fprintf(data->file, "(%s) ***%s %s\n", date, from, - stripped); - else - written += fprintf(data->file, "(%s) %s: %s\n", date, from, - stripped); - } - } else if (type & GAIM_MESSAGE_SYSTEM) - written += fprintf(data->file, "(%s) %s\n", date, stripped); - else if (type & GAIM_MESSAGE_NO_LOG) { - /* This shouldn't happen */ - g_free(stripped); - return written; - } else if (type & GAIM_MESSAGE_WHISPER) - written += fprintf(data->file, "(%s) *%s* %s", date, from, stripped); + g_string_printf(writebuf, "---- %s @ %s ----\n", stripped, date); + } else if (type & GAIM_MESSAGE_SEND || type & GAIM_MESSAGE_RECV) { + if (type & GAIM_MESSAGE_AUTO_RESP) + g_string_printf(writebuf, _("(%s) %s <AUTO-REPLY>: %s\n"), date, from, stripped); + else if(gaim_message_meify(stripped, -1)) + g_string_printf(writebuf, "(%s) ***%s %s\n", date, from, stripped); else - written += fprintf(data->file, "(%s) %s%s %s\n", date, from ? from : "", - from ? ":" : "", stripped); - } + g_string_printf(writebuf, "(%s) %s: %s\n", date, from, stripped); + } else if (type & GAIM_MESSAGE_SYSTEM) + g_string_printf(writebuf, "(%s) %s\n", date, stripped); + else if (type & GAIM_MESSAGE_NO_LOG) { + /* This shouldn't happen */ + g_free(date); + g_free(stripped); + g_string_free(writebuf, TRUE); + return written; + } else if (type & GAIM_MESSAGE_WHISPER) + g_string_printf(writebuf, "(%s) *%s* %s", date, from, stripped); + else + g_string_printf(writebuf, "(%s) %s%s %s\n", date, from ? from : "", from ? ":" : "", stripped); + g_free(date); g_free(stripped); - fflush(data->file); + iostat = g_io_channel_write_chars(data->channel, writebuf->str, -1, &written_buf, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "txt_logger_write could not write the message to the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + else written += written_buf; + + iostat = g_io_channel_flush(data->channel, &gerror); + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "txt_logger_write could not flush the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + + g_string_free(writebuf, TRUE); return written; } @@ -1494,8 +1507,17 @@ { GaimLogCommonLoggerData *data = log->logger_data; if (data) { - if(data->file) - fclose(data->file); + if(data->channel) { + GIOStatus iostat; + GError *gerror = NULL; + + iostat = g_io_channel_shutdown(data->channel, TRUE, &gerror); // this may cause hanging + if (iostat == G_IO_STATUS_ERROR) { + gaim_debug_info("log", "txt_logger_finalize could not shutdown the logfile: %s\n", gerror->message); + g_error_free(gerror); + gerror = NULL; + } + } if(data->path) g_free(data->path); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-04 23:15:49
|
Revision: 16428 Author: roast Date: 2006-07-04 16:15:43 -0700 (Tue, 04 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16428&view=rev Log Message: ----------- data->path freed only if it exists (it should anyway) Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-04 23:14:32 UTC (rev 16427) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-04 23:15:43 UTC (rev 16428) @@ -1178,7 +1178,9 @@ } - g_free(data->path); + + if (data->path) + g_free(data->path); g_slice_free(GaimLogCommonLoggerData, data); } @@ -1359,8 +1361,10 @@ } } - g_free(data->path); + if (data->path) + g_free(data->path); + g_slice_free(GaimLogCommonLoggerData, data); } } @@ -1518,6 +1522,7 @@ gerror = NULL; } } + if(data->path) g_free(data->path); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-05 00:43:02
|
Revision: 16431 Author: roast Date: 2006-07-04 17:42:58 -0700 (Tue, 04 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16431&view=rev Log Message: ----------- reverted 16428/g_free() tests for null arguments. removed txt_logger's g_free check Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-05 00:09:56 UTC (rev 16430) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-05 00:42:58 UTC (rev 16431) @@ -1178,9 +1178,7 @@ } - - if (data->path) - g_free(data->path); + g_free(data->path); g_slice_free(GaimLogCommonLoggerData, data); } @@ -1361,10 +1359,8 @@ } } + g_free(data->path); - if (data->path) - g_free(data->path); - g_slice_free(GaimLogCommonLoggerData, data); } } @@ -1523,8 +1519,7 @@ } } - if(data->path) - g_free(data->path); + g_free(data->path); g_slice_free(GaimLogCommonLoggerData, data); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-06 02:52:22
|
Revision: 16437 Author: roast Date: 2006-07-05 19:52:10 -0700 (Wed, 05 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16437&view=rev Log Message: ----------- xml|html|txt_logger_read uses GIOChannels Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-06 02:40:39 UTC (rev 16436) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-06 02:52:10 UTC (rev 16437) @@ -1193,16 +1193,29 @@ { char *read; GaimLogCommonLoggerData *data = log->logger_data; + int filedes = 0; + GIOChannel *channel; + *flags = GAIM_LOG_READ_NO_NEWLINE; + if (!data || !data->path) return g_strdup(_("<font color=\"red\"><b>Unable to find log path!</b></font>")); - if (g_file_get_contents(data->path, &read, NULL, NULL)) { - gboolean bad_formatting; - char *processed; - bad_formatting = gaim_ufl_to_xhtml(read, &processed); + if ((filedes = open(data->path, O_RDONLY))) { + channel = g_io_channel_unix_new(filedes); + + if (g_io_channel_read_to_end(channel, &read, NULL, NULL) != G_IO_STATUS_ERROR) { + gboolean bad_formatting; + char *processed; + + bad_formatting = gaim_ufl_to_xhtml(read, &processed); + + g_io_channel_shutdown(channel, FALSE, NULL); + close(filedes); + return processed; + } - return processed; + close(filedes); } return g_strdup_printf(_("<font color=\"red\"><b>Could not read file: %s</b></font>"), data->path); @@ -1379,19 +1392,30 @@ { char *read; GaimLogCommonLoggerData *data = log->logger_data; + int filedes = 0; + GIOChannel *channel; + *flags = GAIM_LOG_READ_NO_NEWLINE; if (!data || !data->path) return g_strdup(_("<font color=\"red\"><b>Unable to find log path!</b></font>")); - if (g_file_get_contents(data->path, &read, NULL, NULL)) { - char *minus_header = strchr(read, '\n'); - if (!minus_header) - return read; + if ((filedes = open(data->path, O_RDONLY))) { + channel = g_io_channel_unix_new(filedes); - minus_header = g_strdup(minus_header + 1); - g_free(read); + if (g_io_channel_read_to_end(channel, &read, NULL, NULL) != G_IO_STATUS_ERROR) { + char *minus_header = strchr(read, '\n'); - return minus_header; + if (!minus_header) + return read; + + minus_header = g_strdup(minus_header + 1); + g_free(read); + + g_io_channel_shutdown(channel, FALSE, NULL); + close(filedes); + return minus_header; + } + close(filedes); } return g_strdup_printf(_("<font color=\"red\"><b>Could not read file: %s</b></font>"), data->path); } @@ -1539,21 +1563,34 @@ { char *read, *minus_header, *minus_header2; GaimLogCommonLoggerData *data = log->logger_data; + int filedes = 0; + GIOChannel *channel; + *flags = 0; + if (!data || !data->path) return g_strdup(_("<font color=\"red\"><b>Unable to find log path!</b></font>")); - if (g_file_get_contents(data->path, &read, NULL, NULL)) { - minus_header = strchr(read, '\n'); - if (!minus_header) - minus_header = g_strdup(read); - else - minus_header = g_strdup(minus_header + 1); - g_free(read); - minus_header2 = g_markup_escape_text(minus_header, -1); - g_free(minus_header); - read = gaim_markup_linkify(minus_header2); - g_free(minus_header2); - return read; + + if ((filedes = open(data->path, O_RDONLY))) { + channel = g_io_channel_unix_new(filedes); + + if (g_io_channel_read_to_end(channel, &read, NULL, NULL) != G_IO_STATUS_ERROR) { + minus_header = strchr(read, '\n'); + if (!minus_header) + minus_header = g_strdup(read); + else + minus_header = g_strdup(minus_header + 1); + g_free(read); + minus_header2 = g_markup_escape_text(minus_header, -1); + g_free(minus_header); + read = gaim_markup_linkify(minus_header2); + g_free(minus_header2); + + g_io_channel_shutdown(channel, FALSE, NULL); + close(filedes); + return read; + } + close(filedes); } return g_strdup_printf(_("<font color=\"red\"><b>Could not read file: %s</b></font>"), data->path); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-23 03:47:14
|
Revision: 16543 Author: roast Date: 2006-07-22 20:47:07 -0700 (Sat, 22 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16543&view=rev Log Message: ----------- removed gaim namespace from message.type for bell and whisper Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-23 02:03:19 UTC (rev 16542) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-23 03:47:07 UTC (rev 16543) @@ -1068,10 +1068,10 @@ g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"error\">%s</message>\n", date, from, msg_fixed); } else if (type & GAIM_MESSAGE_WHISPER) { - g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"whisper\">%s</message>\n", date, from, msg_fixed); + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\" type=\"whisper\">%s</message>\n", date, from, msg_fixed); } else if (type & GAIM_MESSAGE_BELL) { - g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\" gaim:type=\"bell\">%s</message>\n", date, from, msg_fixed); + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\" type=\"bell\">%s</message>\n", date, from, msg_fixed); } else if (type & GAIM_MESSAGE_AUTO_RESP && (type & GAIM_MESSAGE_SEND || type & GAIM_MESSAGE_RECV)) { gboolean recv_from_self = FALSE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2006-07-23 04:11:24
|
Revision: 16545 Author: roast Date: 2006-07-22 21:11:21 -0700 (Sat, 22 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16545&view=rev Log Message: ----------- xml logger now recognizes and logs message.type="action" Modified Paths: -------------- branches/soc-2006-file-loggers/src/log.c Modified: branches/soc-2006-file-loggers/src/log.c =================================================================== --- branches/soc-2006-file-loggers/src/log.c 2006-07-23 04:10:52 UTC (rev 16544) +++ branches/soc-2006-file-loggers/src/log.c 2006-07-23 04:11:21 UTC (rev 16545) @@ -1085,8 +1085,9 @@ } } - g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\"%s auto=\"true\">%s</message>\n", - date, from, recv_from_self ? " self=\"true\"" : "", msg_fixed); + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\"%s%s auto=\"true\">%s</message>\n", + date, from, recv_from_self ? " self=\"true\"" : "", + gaim_message_is_meify(msg_fixed, -1) ? " type=\"action\"": "", msg_fixed); } else if (type & GAIM_MESSAGE_SEND || type & GAIM_MESSAGE_RECV) { gboolean recv_from_self = FALSE; @@ -1100,8 +1101,9 @@ } } - g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\"%s>%s</message>\n", - date, from, recv_from_self ? " self=\"true\"" : "", msg_fixed); + g_string_printf(writebuf, "\t<message time=\"%s\" sender=\"%s\"%s%s>%s</message>\n", + date, from, recv_from_self ? " self=\"true\"" : "", + gaim_message_is_meify(msg_fixed, -1) ? " type=\"action\"": "", msg_fixed); } else { gaim_debug_error("log", "Unhandled message type."); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |