annotate mcabber/src/histolog.c @ 1461:8fa24a6d1a93

Improve Remote Controlling Clients The XEP recommends adding the node to the IQ response. Some clients seem not to understand the answer when it is omitted. Problem reported by Rhaamo and js (thanks to js for spotting the node issue!).
author Mikael Berthe <mikael@lilotux.net>
date Sat, 12 Apr 2008 13:35:03 +0200
parents 071c8170b7de
children ec55cdf44335
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
1 /*
699
ee03b56b93ee Update Copyright (2006)
Mikael Berthe <mikael@lilotux.net>
parents: 635
diff changeset
2 * histolog.c -- File history handling
395
3e4f2f98c0bf Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents: 394
diff changeset
3 *
1414
366ef500c522 Update copyrights
Mikael Berthe <mikael@lilotux.net>
parents: 1342
diff changeset
4 * Copyright (C) 2005-2008 Mikael Berthe <mikael@lilotux.net>
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
5 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or (at
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
9 * your option) any later version.
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
10 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful, but
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
14 * General Public License for more details.
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
15 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
19 * USA
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
20 */
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
21
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
22 #include <string.h>
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
23 #include <stdlib.h>
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
24 #include <time.h>
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
25 #include <ctype.h>
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
26 #include <sys/types.h>
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
27 #include <sys/stat.h>
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
28 #include <fcntl.h>
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
29 #include <unistd.h>
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
30
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
31 #include "histolog.h"
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
32 #include "hbuf.h"
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
33 #include "jabglue.h"
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
34 #include "utils.h"
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
35 #include "screen.h"
635
d4119cb85aeb New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
36 #include "settings.h"
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
37 #include "utils.h"
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
38 #include "roster.h"
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
39
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
40 static guint UseFileLogging;
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
41 static guint FileLoadLogs;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
42 static char *RootDir;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
43
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
44
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
45 // user_histo_file(jid)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
46 // Returns history filename for the given jid
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
47 // Note: the caller *must* free the filename after use (if not null).
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
48 static char *user_histo_file(const char *bjid)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
49 {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
50 char *filename;
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
51 char *lowerid;
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
52
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
53 if (!(UseFileLogging || FileLoadLogs))
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
54 return NULL;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
55
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
56 lowerid = g_strdup(bjid);
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
57 if (!lowerid)
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
58 return NULL;
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
59 mc_strtolower(lowerid);
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
60
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
61 filename = g_strdup_printf("%s%s", RootDir, lowerid);
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
62 g_free(lowerid);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
63 return filename;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
64 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
65
1155
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
66 char *hlog_get_log_jid(const char *bjid)
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
67 {
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
68 struct stat bufstat;
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
69 char *path;
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
70 char *log_jid = NULL;
1303
b6fdbfa6b219 Minor whitespace change
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
71
1155
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
72 path = user_histo_file(bjid);
1303
b6fdbfa6b219 Minor whitespace change
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
73 do {
b6fdbfa6b219 Minor whitespace change
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
74 if (lstat(path, &bufstat) != 0)
1155
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
75 break;
1303
b6fdbfa6b219 Minor whitespace change
Mikael Berthe <mikael@lilotux.net>
parents: 1290
diff changeset
76 if (S_ISLNK(bufstat.st_mode)) {
1155
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
77 g_free(log_jid);
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
78 log_jid = g_new(char, bufstat.st_size+1);
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
79 readlink(path, log_jid, bufstat.st_size);
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
80 g_free(path);
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
81 log_jid[bufstat.st_size] = '\0';
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
82 path = user_histo_file(log_jid);
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
83 } else {
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
84 g_free(path);
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
85 path = NULL;
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
86 }
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
87 } while( path );
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
88
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
89 return log_jid;
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
90 }
3b9bbf6c4c93 Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents: 1144
diff changeset
91
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
92 // write_histo_line()
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
93 // Adds a history (multi-)line to the jid's history logfile
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
94 static void write_histo_line(const char *bjid,
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
95 time_t timestamp, guchar type, guchar info, const char *data)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
96 {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
97 guint len = 0;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
98 FILE *fp;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
99 time_t ts;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
100 const char *p;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
101 char *filename;
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
102 char str_ts[20];
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
103 int err;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
104
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
105 if (!UseFileLogging)
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
106 return;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
107
1144
b8f5fe2d666a Add option "logging_ignore_status"
Mikael Berthe <mikael@lilotux.net>
parents: 1141
diff changeset
108 // Do not log status messages when 'logging_ignore_status' is set
b8f5fe2d666a Add option "logging_ignore_status"
Mikael Berthe <mikael@lilotux.net>
parents: 1141
diff changeset
109 if (type == 'S' && settings_opt_get_int("logging_ignore_status"))
b8f5fe2d666a Add option "logging_ignore_status"
Mikael Berthe <mikael@lilotux.net>
parents: 1141
diff changeset
110 return;
b8f5fe2d666a Add option "logging_ignore_status"
Mikael Berthe <mikael@lilotux.net>
parents: 1141
diff changeset
111
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
112 filename = user_histo_file(bjid);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
113
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
114 // If timestamp is null, get current date
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
115 if (timestamp)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
116 ts = timestamp;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
117 else
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
118 time(&ts);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
119
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
120 if (!data)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
121 data = "";
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
122
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
123 // Count number of extra lines
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
124 for (p=data ; *p ; p++)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
125 if (*p == '\n') len++;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
126
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
127 /* Line format: "TI yyyymmddThh:mm:ssZ LLL [data]"
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
128 * T=Type, I=Info, yyyymmddThh:mm:ssZ=date, LLL=0-padded-len
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
129 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
130 * Types:
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
131 * - M message Info: S (send) R (receive) I (info)
1311
0dda8238af21 Implement "/roster display"
Mikael Berthe <mikael@lilotux.net>
parents: 1303
diff changeset
132 * - S status Info: [_ofdnai]
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
133 * We don't check them, we trust the caller.
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
134 * (Info messages are not sent nor received, they're generated
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
135 * locally by mcabber.)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
136 */
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
137
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
138 fp = fopen(filename, "a");
155
8a54d46e889a [/trunk] Changeset 167 by mikael
mikael
parents: 118
diff changeset
139 g_free(filename);
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
140 if (!fp) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
141 scr_LogPrint(LPRINT_LOGNORM, "Unable to write history "
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
142 "(cannot open logfile)");
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
143 return;
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
144 }
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
145
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
146 to_iso8601(str_ts, ts);
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
147 err = fprintf(fp, "%c%c %-18.18s %03d %s\n", type, info, str_ts, len, data);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
148 fclose(fp);
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
149 if (err < 0) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
150 scr_LogPrint(LPRINT_LOGNORM, "Error while writing to log file: %s",
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
151 strerror(errno));
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
152 }
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
153 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
154
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
155 // hlog_read_history()
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
156 // Reads the jid's history logfile
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
157 void hlog_read_history(const char *bjid, GList **p_buddyhbuf, guint width)
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
158 {
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
159 char *filename;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
160 guchar type, info;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
161 char *data, *tail;
1436
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
162 guint data_size;
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
163 char *xtext;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
164 time_t timestamp;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
165 guint prefix_flags;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
166 guint len;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
167 FILE *fp;
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
168 struct stat bufstat;
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
169 guint err = 0;
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
170 guint ln = 0; // line number
899
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
171 time_t starttime;
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
172 int max_num_of_blocks;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
173
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
174 if (!FileLoadLogs)
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
175 return;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
176
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
177 if ((roster_gettype(bjid) & ROSTER_TYPE_ROOM) &&
635
d4119cb85aeb New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
178 (settings_opt_get_int("load_muc_logs") != 1))
d4119cb85aeb New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
179 return;
d4119cb85aeb New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
180
1436
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
181 data_size = HBB_BLOCKSIZE+32;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
182 data = g_new(char, data_size);
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
183 if (!data) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
184 scr_LogPrint(LPRINT_LOGNORM, "Not enough memory to read history file");
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
185 return;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
186 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
187
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
188 filename = user_histo_file(bjid);
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
189
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
190 fp = fopen(filename, "r");
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
191 g_free(filename);
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
192 if (!fp) {
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
193 g_free(data);
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
194 return;
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
195 }
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
196
394
4617d0f029ea Update "large file" size value to 3MB
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
197 // If file is large (> 3MB here), display a message to inform the user
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
198 // (it can take a while...)
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
199 if (!fstat(fileno(fp), &bufstat)) {
1274
c33b5b6fbf08 Fix screen refresh issue (spotted by franky)
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
200 if (bufstat.st_size > 3145728) {
c33b5b6fbf08 Fix screen refresh issue (spotted by franky)
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
201 scr_LogPrint(LPRINT_NORMAL, "Reading <%s> history file...", bjid);
c33b5b6fbf08 Fix screen refresh issue (spotted by franky)
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
202 scr_DoUpdate();
c33b5b6fbf08 Fix screen refresh issue (spotted by franky)
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
203 }
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
204 }
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
205
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
206 max_num_of_blocks = get_max_history_blocks();
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
207
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
208 starttime = 0L;
899
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
209 if (settings_opt_get_int("max_history_age") > 0) {
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
210 int maxdays = settings_opt_get_int("max_history_age");
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
211 time(&starttime);
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
212 if (maxdays >= starttime/86400L)
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
213 starttime = 0L;
899
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
214 else
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
215 starttime -= maxdays * 86400L;
899
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
216 }
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
217
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
218 /* See write_histo_line() for line format... */
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
219 while (!feof(fp)) {
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
220 guint dataoffset = 25;
1436
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
221 guint noeol;
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
222
1436
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
223 if (fgets(data, data_size-1, fp) == NULL)
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
224 break;
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
225 ln++;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
226
1436
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
227 while (1) {
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
228 for (tail = data; *tail; tail++) ;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
229 noeol = (*(tail-1) != '\n');
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
230 if (!noeol)
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
231 break;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
232 /* TODO: duplicated code... could do better... */
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
233 if (tail == data + data_size-2) {
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
234 // The buffer is too small to contain the whole line.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
235 // Let's allocate some more space.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
236 if (!max_num_of_blocks ||
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
237 data_size/HBB_BLOCKSIZE < 5U*max_num_of_blocks) {
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
238 guint toffset = tail - data;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
239 // Allocate one more block.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
240 data_size = HBB_BLOCKSIZE * (1 + data_size/HBB_BLOCKSIZE);
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
241 data = g_renew(char, data, data_size);
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
242 // Update the tail pointer, as the data may have been moved.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
243 tail = data + toffset;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
244 if (fgets(tail, data_size-1 - (tail-data), fp) == NULL)
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
245 break;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
246 } else {
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
247 scr_LogPrint(LPRINT_LOGNORM, "Line too long in history file!");
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
248 ln--;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
249 break;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
250 }
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
251 }
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
252 }
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
253
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
254 type = data[0];
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
255 info = data[1];
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
256
395
3e4f2f98c0bf Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents: 394
diff changeset
257 if ((type != 'M' && type != 'S') ||
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
258 ((data[11] != 'T') || (data[20] != 'Z') ||
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
259 (data[21] != ' ') ||
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
260 (data[25] != ' ' && data[26] != ' '))) {
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
261 if (!err) {
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
262 scr_LogPrint(LPRINT_LOGNORM,
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
263 "Error in history file format (%s), l.%u", bjid, ln);
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
264 err = 1;
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
265 }
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
266 continue;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
267 }
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
268 // The number of lines can be written with 3 or 4 bytes.
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
269 if (data[25] != ' ') dataoffset = 26;
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
270 data[21] = data[dataoffset] = 0;
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
271 timestamp = from_iso8601(&data[3], 1);
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
272 len = (guint) atoi(&data[22]);
395
3e4f2f98c0bf Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents: 394
diff changeset
273
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
274 // Some checks
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
275 if (((type == 'M') && (info != 'S' && info != 'R' && info != 'I')) ||
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
276 ((type == 'S') && (!strchr("_OFDNAI", info)))) {
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
277 if (!err) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
278 scr_LogPrint(LPRINT_LOGNORM, "Error in history file format (%s), l.%u",
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
279 bjid, ln);
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
280 err = 1;
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
281 }
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
282 continue;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
283 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
284
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
285 while (len--) {
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
286 ln++;
1436
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
287 if (fgets(tail, data_size-1 - (tail-data), fp) == NULL)
249
c3e6e78d1ab4 [/trunk] Changeset 262 by mikael
mikael
parents: 248
diff changeset
288 break;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
289
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
290 while (*tail) tail++;
1436
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
291 noeol = (*(tail-1) != '\n');
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
292 if (tail == data + data_size-2 && (len || noeol)) {
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
293 // The buffer is too small to contain the whole message.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
294 // Let's allocate some more space.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
295 if (!max_num_of_blocks ||
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
296 data_size/HBB_BLOCKSIZE < 5U*max_num_of_blocks) {
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
297 guint toffset = tail - data;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
298 // If the line hasn't been read completely and we reallocate the
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
299 // buffer, we want to read one more time.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
300 if (noeol)
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
301 len++;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
302 // Allocate one more block.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
303 data_size = HBB_BLOCKSIZE * (1 + data_size/HBB_BLOCKSIZE);
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
304 data = g_renew(char, data, data_size);
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
305 // Update the tail pointer, as the data may have been moved.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
306 tail = data + toffset;
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
307 } else {
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
308 // There will probably be a parse error on next read, because
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
309 // this message hasn't been read entirely.
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
310 scr_LogPrint(LPRINT_LOGNORM, "Message too big in history file!");
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
311 }
6fb141142388 Improve reading of history files
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
312 }
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
313 }
251
806fcdd3b5da [/trunk] Changeset 264 by mikael
mikael
parents: 250
diff changeset
314 // Remove last CR (we keep it if the line is empty, too)
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
315 if ((tail > data+dataoffset+1) && (*(tail-1) == '\n'))
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
316 *(tail-1) = 0;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
317
899
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
318 // Check if the data is older than max_history_age
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
319 if (starttime) {
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
320 if (timestamp > starttime)
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
321 starttime = 0L; // From now on, load everything
899
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
322 else
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
323 continue;
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
324 }
a833f3d6119a Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents: 795
diff changeset
325
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
326 if (type == 'M') {
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
327 char *converted;
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
328 if (info == 'S') {
1204
e802ec0c02d2 Basic support for nick highlighting in MUC rooms (the whole line is colored)
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
329 prefix_flags = HBB_PREFIX_OUT | HBB_PREFIX_HLIGHT_OUT;
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
330 } else {
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
331 prefix_flags = HBB_PREFIX_IN;
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
332 if (info == 'I')
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
333 prefix_flags = HBB_PREFIX_INFO;
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
334 }
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
335 converted = from_utf8(&data[dataoffset+1]);
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
336 if (converted) {
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
337 xtext = ut_expand_tabs(converted); // Expand tabs
1141
5be2408a6534 Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
338 hbuf_add_line(p_buddyhbuf, xtext, timestamp, prefix_flags, width,
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1274
diff changeset
339 max_num_of_blocks, 0);
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
340 if (xtext != converted)
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
341 g_free(xtext);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
342 g_free(converted);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
343 }
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
344 err = 0;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
345 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
346 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
347 fclose(fp);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
348 g_free(data);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
349 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
350
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
351 // hlog_enable()
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
352 // Enable logging to files. If root_dir is NULL, then $HOME/.mcabber is used.
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
353 // If loadfiles is TRUE, we will try to load buddies history logs from file.
281
f562b9af2de7 Add "const" specifier in prototypes
Mikael Berthe <mikael@lilotux.net>
parents: 277
diff changeset
354 void hlog_enable(guint enable, const char *root_dir, guint loadfiles)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
355 {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
356 UseFileLogging = enable;
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
357 FileLoadLogs = loadfiles;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
358
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
359 if (enable || loadfiles) {
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
360 if (root_dir) {
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1155
diff changeset
361 char *xp_root_dir;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
362 int l = strlen(root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
363 if (l < 1) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
364 scr_LogPrint(LPRINT_LOGNORM, "Error: logging dir name too short");
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
365 UseFileLogging = FileLoadLogs = FALSE;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
366 return;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
367 }
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1155
diff changeset
368 xp_root_dir = expand_filename(root_dir);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
369 // RootDir must be slash-terminated
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1155
diff changeset
370 if (root_dir[l-1] == '/') {
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1155
diff changeset
371 RootDir = xp_root_dir;
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1155
diff changeset
372 } else {
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1155
diff changeset
373 RootDir = g_strdup_printf("%s/", xp_root_dir);
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1155
diff changeset
374 g_free(xp_root_dir);
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1155
diff changeset
375 }
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
376 } else {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
377 char *home = getenv("HOME");
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
378 const char *dir = "/.mcabber/histo/";
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
379 RootDir = g_strdup_printf("%s%s", home, dir);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
380 }
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
381 // Check directory permissions (should not be readable by group/others)
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
382 if (checkset_perm(RootDir, TRUE) == -1) {
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
383 // The directory does not actually exists
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
384 g_free(RootDir);
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
385 RootDir = NULL;
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
386 scr_LogPrint(LPRINT_LOGNORM, "ERROR: Cannot access "
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
387 "history log directory, logging DISABLED");
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
388 UseFileLogging = FileLoadLogs = FALSE;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
389 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
390 } else { // Disable history logging
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
391 g_free(RootDir);
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
392 RootDir = NULL;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
393 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
394 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
395
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
396 guint hlog_is_enabled(void)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
397 {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
398 return UseFileLogging;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
399 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
400
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
401 inline void hlog_write_message(const char *bjid, time_t timestamp, int sent,
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
402 const char *msg)
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
403 {
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
404 guchar info;
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
405 /* sent=1 message sent by mcabber
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
406 * sent=0 message received by mcabber
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
407 * sent=-1 local info message
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
408 */
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
409 if (sent == 1)
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
410 info = 'S';
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
411 else if (sent == 0)
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
412 info = 'R';
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
413 else
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
414 info = 'I';
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
415 write_histo_line(bjid, timestamp, 'M', info, msg);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
416 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
417
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
418 inline void hlog_write_status(const char *bjid, time_t timestamp,
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 197
diff changeset
419 enum imstatus status, const char *status_msg)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
420 {
1205
2de8f8ba1f34 Update copyrights
Mikael Berthe <mikael@lilotux.net>
parents: 1204
diff changeset
421 // XXX Check status value?
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 899
diff changeset
422 write_histo_line(bjid, timestamp, 'S', toupper(imstatus2char[status]),
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 197
diff changeset
423 status_msg);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
424 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
425
1437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
426
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
427 // hlog_save_state()
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
428 // If enabled, save the current state of the roster
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
429 // (i.e. pending messages) to a temporary file.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
430 void hlog_save_state(void)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
431 {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
432 gpointer unread_ptr, first_unread;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
433 const char *bjid;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
434 char *statefile_xp;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
435 FILE *fp;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
436 const char *statefile = settings_opt_get("statefile");
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
437
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
438 if (!statefile || !UseFileLogging)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
439 return;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
440
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
441 statefile_xp = expand_filename(statefile);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
442 fp = fopen(statefile_xp, "w");
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
443 if (!fp) {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
444 scr_LogPrint(LPRINT_NORMAL, "Cannot open state file [%s]",
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
445 strerror(errno));
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
446 goto hlog_save_state_return;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
447 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
448
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
449 if (!jb_getonline()) {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
450 // We're not connected. Let's use the unread_jids hash.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
451 GList *unread_jid = unread_jid_get_list();
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
452 unread_ptr = unread_jid;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
453 for ( ; unread_jid ; unread_jid = g_list_next(unread_jid))
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
454 fprintf(fp, "%s\n", (char*)unread_jid->data);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
455 g_list_free(unread_ptr);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
456 goto hlog_save_state_return;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
457 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
458
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
459 if (!current_buddy) // Safety check -- shouldn't happen.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
460 goto hlog_save_state_return;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
461
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
462 // We're connected. Let's use unread_msg().
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
463 unread_ptr = first_unread = unread_msg(NULL);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
464 if (!first_unread)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
465 goto hlog_save_state_return;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
466
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
467 do {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
468 guint type = buddy_gettype(unread_ptr);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
469 if (type & (ROSTER_TYPE_USER|ROSTER_TYPE_AGENT)) {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
470 bjid = buddy_getjid(unread_ptr);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
471 if (bjid)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
472 fprintf(fp, "%s\n", bjid);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
473 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
474 unread_ptr = unread_msg(unread_ptr);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
475 } while (unread_ptr && unread_ptr != first_unread);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
476
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
477 hlog_save_state_return:
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
478 if (fp) {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
479 long filelen = ftell(fp);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
480 fclose(fp);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
481 if (!filelen)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
482 unlink(statefile_xp);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
483 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
484 g_free(statefile_xp);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
485 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
486
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
487 // hlog_load_state()
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
488 // If enabled, load the current state of the roster
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
489 // (i.e. pending messages) from a temporary file.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
490 // This function adds the JIDs to the unread_jids hash table,
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
491 // so it should only be called at startup.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
492 void hlog_load_state(void)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
493 {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
494 char bjid[1024];
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
495 char *statefile_xp;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
496 FILE *fp;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
497 const char *statefile = settings_opt_get("statefile");
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
498
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
499 if (!statefile || !UseFileLogging)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
500 return;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
501
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
502 statefile_xp = expand_filename(statefile);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
503 fp = fopen(statefile_xp, "r");
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
504 if (fp) {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
505 char *eol;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
506 while (!feof(fp)) {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
507 if (fgets(bjid, sizeof bjid, fp) == NULL)
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
508 break;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
509 // Let's remove the trailing newline.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
510 // Also remove whitespace, if the file as been (badly) manually modified.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
511 for (eol = bjid; *eol; eol++) ;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
512 for (eol--; eol >= bjid && (*eol == '\n' || *eol == ' '); *eol-- = 0) ;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
513 // Safety checks...
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
514 if (!bjid[0])
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
515 continue;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
516 if (check_jid_syntax(bjid)) {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
517 scr_LogPrint(LPRINT_LOGNORM,
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
518 "ERROR: Invalid JID in state file. Corrupted file?");
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
519 break;
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
520 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
521 // Display a warning if there are pending messages but the user
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
522 // won't see them because load_log isn't set.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
523 if (!FileLoadLogs) {
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
524 scr_LogPrint(LPRINT_LOGNORM, "WARNING: unread message from <%s>.",
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
525 bjid);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
526 scr_setmsgflag_if_needed(SPECIAL_BUFFER_STATUS_ID, TRUE);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
527 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
528 // Add the JID to unread_jids. It will be used when the contact is
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
529 // added to the roster.
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
530 unread_jid_add(bjid);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
531 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
532 fclose(fp);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
533 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
534 g_free(statefile_xp);
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
535 }
071c8170b7de Add option 'statefile' to keep track of unread messages across restarts
Mikael Berthe <mikael@lilotux.net>
parents: 1436
diff changeset
536
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
537 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */