/soc/2015/igor.gajowiak/chatlog: 48b7ccc5444a: Fixed parsing mes...

Igor Gajowiak <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 48b7ccc5444ac72c1539676158fdf1453ba8322b
Author:	 Igor Gajowiak <[email protected]>
Date:	 2015-08-06 20:27 +0200
Branch:	 default
URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/48b7ccc5444a

Description:

Fixed parsing message timestamp from the legacy log.

diffstat:

 libpurple/plugins/log/legacylog.c |  108 +++++++++++++++++++++++++------------
 1 files changed, 72 insertions(+), 36 deletions(-)

diffs (181 lines):

diff --git a/libpurple/plugins/log/legacylog.c b/libpurple/plugins/log/legacylog.c
--- a/libpurple/plugins/log/legacylog.c
+++ b/libpurple/plugins/log/legacylog.c
@@ -37,6 +37,10 @@
 /* PurpleGenericLog API implementation                                    */
 /**************************************************************************/
 
+static GRegex *msg_regex = NULL;
+static GRegex *date_regex = NULL;
+static GRegex *time_regex = NULL;
+
 typedef enum
 {
 	DIR_DEPTH_PROTOCOL  = 1,
@@ -302,37 +306,54 @@ normalize_protocol_name(const gchar *pro
 		return protocol;
 }
 
-/**
- * TODO: Use regex
- *
- * date "YYYY-MM-DD.hhmmss"
- * time "HH:MM:SS (A|P)M"
- */
-static guint64
-make_timestamp(const gchar *date, const gchar *msg_time)
+static gboolean
+parse_timestamp(const gchar *date, const gchar *time, guint64 *result)
 {
-	int year = atoi(date);
-	date += 5;
-	int month = atoi(date);
-	date += 3;
-	int day = atoi(date);
-	date += 3;
+	g_assert(date);
+	g_assert(time);
+	g_assert(result);
 
-	int hour = 0;
-	for(int i = 0; i < 2; ++i, ++msg_time)
-		hour = hour * 10 + (*msg_time - '0');
-	++msg_time;
-	int min = 0;
-	for(int i = 0; i < 2; ++i, ++msg_time)
-		min = min * 10 + (*msg_time - '0');
-	++msg_time;
-	int sec = 0;
-	for(int i = 0; i < 2; ++i, ++msg_time)
-		sec = sec * 10 + (*msg_time - '0');
-	if(*(++msg_time) == 'P')
+	GMatchInfo *info = NULL;
+	gint begin, end;
+
+	if (!g_regex_match(date_regex, date, 0, &info)) {
+		g_match_info_free(info);
+		return FALSE;
+	}
+
+	g_match_info_fetch_pos(info, 1, &begin, &end);
+	guint64 year = g_ascii_strtoull(&date[begin], NULL, 10);
+
+	g_match_info_fetch_pos(info, 2, &begin, &end);
+	guint64 month = g_ascii_strtoull(&date[begin], NULL, 10);
+
+	g_match_info_fetch_pos(info, 3, &begin, &end);
+	guint64 day = g_ascii_strtoull(&date[begin], NULL, 10);
+
+	g_match_info_free(info);
+
+	if (!g_regex_match(time_regex, time, 0, &info)) {
+		g_match_info_free(info);
+		return FALSE;
+	}
+
+	g_match_info_fetch_pos(info, 1, &begin, &end);
+	guint64 hour = g_ascii_strtoull(&time[begin], NULL, 10);
+
+	g_match_info_fetch_pos(info, 2, &begin, &end);
+	guint64 min = g_ascii_strtoull(&time[begin], NULL, 10);
+
+	g_match_info_fetch_pos(info, 3, &begin, &end);
+	guint64 sec = g_ascii_strtoull(&time[begin], NULL, 10);
+
+	g_match_info_fetch_pos(info, 4, &begin, &end);
+	if (g_strcmp0(&time[begin], "PM") == 0)
 		hour += 12;
+	
+	g_match_info_free(info);
 
-	return purple_time_build(year, month, day, hour, min, sec);
+	*result = purple_time_build(year, month, day, hour, min, sec);
+	return TRUE;
 }
 
 static PurpleAccount*
@@ -353,6 +374,10 @@ make_message(PurpleAccount *account, con
 	if (!buddy)
 		return NULL;
 
+	guint64 timestamp;
+	if(!parse_timestamp(iter->log_file_name, msg_time, &timestamp))
+		return NULL;
+
 	PurpleMessage *msg;
 	if (strcmp(color, "#A82F2F") == 0) {
 		msg = purple_message_new_incoming(purple_buddy_get_name(buddy),
@@ -363,7 +388,6 @@ make_message(PurpleAccount *account, con
 			contents, PURPLE_MESSAGE_SEND);
 	}
 
-	guint64 timestamp = make_timestamp(iter->log_file_name, msg_time);
 	purple_message_set_time(msg, timestamp);
 
 	return msg;
@@ -377,7 +401,6 @@ remove_divs(gchar *text)
 
 	for (size_t i = 0; i < len && text[i] != '\0';) {
 		if (len - i >= 5 && g_str_has_prefix(&text[i], "<div>")) {
-			g_string_append_c(result, '\n');
 			i += 5;
 		}
 		else if (len - i >= 6 && g_str_has_prefix(&text[i], "</div>")) {
@@ -396,13 +419,8 @@ remove_divs(gchar *text)
 static int
 fill_arrays(gchar *text, GArray *accounts, GArray *messages, const Iter *iter)
 {
-	GRegex *regex = g_regex_new(
-		"<font color=\"(.*?)\"><font size=.*?>\\((.*?)\\)</font> .*?"
-		"</b></font>(.*?)<br/>",
-		0, 0, NULL);
-
 	GMatchInfo *info;
-	g_regex_match(regex, text, 0, &info);
+	g_regex_match(msg_regex, text, 0, &info);
 
 	int msgs_count = 0;
 	while (g_match_info_matches(info)) {
@@ -435,7 +453,6 @@ fill_arrays(gchar *text, GArray *account
     }
 
 	g_match_info_free(info);
-	g_regex_unref(regex);
 
 	return msgs_count;
 }
@@ -630,15 +647,34 @@ plugin_load(PurplePlugin *plugin, GError
 		PURPLE_GENERICLOG_PROPERTY_NAME, LEGACYLOG_NAME,
 		NULL);
 	purple_genericlog_register(PURPLE_GENERICLOG(legacylog_instance));
+
+	msg_regex = g_regex_new(
+		"<font color=\"(.*?)\"><font size=.*?>\\((.*?)\\)</font> .*?"
+		"</b></font>(.*?)<br/>",
+		0, 0, NULL);
+	g_assert(msg_regex);
+
+	date_regex = g_regex_new("^([\\d]{4})-([\\d]{2})-([\\d]{2})\\.",0, 0, NULL);
+	g_assert(date_regex);
+
+	time_regex = g_regex_new("^([\\d]{2}):([\\d]{2}):([\\d]{2}) (AM|PM)",
+		0, 0, NULL);
+	g_assert(time_regex);
+
 	return TRUE;
 }
 
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
+	g_regex_unref(msg_regex);
+	g_regex_unref(date_regex);
+	g_regex_unref(time_regex);
+
 	purple_genericlog_unregister(PURPLE_GENERICLOG(legacylog_instance));
 	g_object_unref(legacylog_instance);
 	legacylog_instance = NULL;
+
 	return TRUE;
 }
 

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.