about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/database.c46
-rw-r--r--src/database.h1
-rw-r--r--src/ui/chatwin.c27
3 files changed, 53 insertions, 21 deletions
diff --git a/src/database.c b/src/database.c
index 988bfeae..f72ea5a0 100644
--- a/src/database.c
+++ b/src/database.c
@@ -247,9 +247,14 @@ _add_to_db(ProfMessage *message, const char * const type, const Jid * const from
 
     char *err_msg;
     char *query;
+    gchar *date_fmt;
+
+    if (message->timestamp) {
+        date_fmt = g_date_time_format_iso8601(message->timestamp);
+    } else {
+        date_fmt = g_date_time_format_iso8601(g_date_time_new_now_local());
+    }
 
-    //gchar *date_fmt = g_date_time_format_iso8601(message->timestamp);
-    gchar *date_fmt = g_date_time_format(message->timestamp, "%Y/%m/%d %H:%M:%S");
     if (asprintf(&query, "INSERT INTO `ChatLogs` (`from_jid`, `from_resource`, `to_jid`, `to_resource`, `message`, `timestamp`, `stanza_id`, `replace_id`, `type`, `encryption`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
                 from_jid->barejid,
                 from_jid->resourcepart ? from_jid->resourcepart : "",
@@ -276,3 +281,40 @@ _add_to_db(ProfMessage *message, const char * const type, const Jid * const from
     }
     free(query);
 }
+
+GSList*
+log_database_get_previous_chat(const gchar *const login, const gchar *const recipient)
+{
+	sqlite3_stmt *stmt = NULL;
+    char *query;
+
+    if (asprintf(&query, "SELECT `message`, `timestamp`, `from_jid` from `ChatLogs` WHERE `from_jid` = '%s' OR `to_jid` = '%s' ORDER BY `id` ASC LIMIT 10", recipient, recipient) == -1) {
+        log_error("log_database_get_previous_chat(): could not allocate memory");
+        return NULL;
+    }
+
+	int rc = sqlite3_prepare_v2(g_chatlog_database, query, -1, &stmt, NULL);
+	if( rc!=SQLITE_OK ) {
+        log_error("log_database_get_previous_chat(): unknown SQLite error");
+        return NULL;
+    }
+
+    GSList *history = NULL;
+
+	while( sqlite3_step(stmt) == SQLITE_ROW ) {
+		char *message = (char*)sqlite3_column_text(stmt, 0);
+		char *date = (char*)sqlite3_column_text(stmt, 1);
+		char *from = (char*)sqlite3_column_text(stmt, 2);
+
+        ProfMessage *msg = message_init();
+        msg->jid = jid_create(from);
+        msg->plain = strdup(message);
+        msg->timestamp = g_date_time_new_from_iso8601(date, NULL);
+        // TODO: later we can get more fields like 'enc'. then we can display the history like regular chats with all info the user enabled.
+
+        history = g_slist_append(history, msg);
+	}
+	sqlite3_finalize(stmt);
+
+    return history;
+}
diff --git a/src/database.h b/src/database.h
index 6361631d..d0f6eb69 100644
--- a/src/database.h
+++ b/src/database.h
@@ -47,6 +47,7 @@ void log_database_add_incoming_muc_pm(ProfMessage *message);
 void log_database_add_outgoing_chat(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc);
 void log_database_add_outgoing_muc(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc);
 void log_database_add_outgoing_muc_pm(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc);
+GSList* log_database_get_previous_chat(const gchar *const login, const gchar *const recipient);
 void log_database_close(void);
 
 #endif // DATABASE_H
diff --git a/src/ui/chatwin.c b/src/ui/chatwin.c
index 9ebc8d76..41e70b40 100644
--- a/src/ui/chatwin.c
+++ b/src/ui/chatwin.c
@@ -44,6 +44,7 @@
 #include "window_list.h"
 #include "xmpp/roster_list.h"
 #include "log.h"
+#include "database.h"
 #include "config/preferences.h"
 #include "ui/ui.h"
 #include "ui/window.h"
@@ -481,33 +482,21 @@ _chatwin_history(ProfChatWin *chatwin, const char *const contact)
 {
     if (!chatwin->history_shown) {
         Jid *jid = jid_create(connection_get_fulljid());
-        GSList *history = chat_log_get_previous(jid->barejid, contact);
+        //GSList *history = chat_log_get_previous(jid->barejid, contact);
+        // TODO: jid not needed
+        GSList *history = log_database_get_previous_chat(jid->barejid, contact);
         jid_destroy(jid);
         GSList *curr = history;
-        int idd = 0;
-        int imo = 0;
-        int iyy = 0;
 
         while (curr) {
-            char *line = curr->data;
-            // entry, containing the actual entries with date followed by text
-            if (line[2] == ':') {
-                char hh[3]; memcpy(hh, &line[0], 2); hh[2] = '\0'; int ihh = atoi(hh);
-                char mm[3]; memcpy(mm, &line[3], 2); mm[2] = '\0'; int imm = atoi(mm);
-                char ss[3]; memcpy(ss, &line[6], 2); ss[2] = '\0'; int iss = atoi(ss);
-                GDateTime *timestamp = g_date_time_new_local(iyy, imo, idd, ihh, imm, iss);
-                win_print_history((ProfWin*)chatwin, timestamp, curr->data+11);
-                g_date_time_unref(timestamp);
-            // header, containing the date from filename "21/10/2019:"
-            } else {
-                char dd[3]; memcpy(dd, &line[0], 2); dd[2] = '\0'; idd = atoi(dd);
-                char mm[3]; memcpy(mm, &line[3], 2); mm[2] = '\0'; imo = atoi(mm);
-                char yy[5]; memcpy(yy, &line[6], 4); yy[4] = '\0'; iyy = atoi(yy);
-            }
+            ProfMessage *msg = curr->data;
+            // TODO: sender is lost right now
+            win_print_history((ProfWin*)chatwin, msg->timestamp, msg->plain);
             curr = g_slist_next(curr);
         }
         chatwin->history_shown = TRUE;
 
+        //TODO: message_free
         g_slist_free_full(history, free);
     }
 }