annotate mcabber/src/histolog.c @ 830:80434fde7cfa

Display presence notification timestamps when they exist These timestamps were used in the roster, but not in the buffer window message nor in the history logfile. Reported by "ze".
author Mikael Berthe <mikael@lilotux.net>
date Wed, 03 May 2006 11:28:41 +0200
parents b16acadd7d53
children a833f3d6119a
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 *
699
ee03b56b93ee Update Copyright (2006)
Mikael Berthe <mikael@lilotux.net>
parents: 635
diff changeset
4 * Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.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>
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
29
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
30 #include "histolog.h"
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
31 #include "hbuf.h"
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
32 #include "jabglue.h"
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
33 #include "utils.h"
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
34 #include "logprint.h"
635
d4119cb85aeb New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
35 #include "settings.h"
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
36 #include "utils.h"
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
37
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
38 static guint UseFileLogging;
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
39 static guint FileLoadLogs;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
40 static char *RootDir;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
41
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
42
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
43 // user_histo_file()
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
44 // Returns history filename for the given jid
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
45 // Note: the caller *must* free the filename after use (if not null).
111
d896962c16fa [/trunk] Changeset 125 by mikael
mikael
parents: 110
diff changeset
46 static char *user_histo_file(const char *jid)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
47 {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
48 char *filename;
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
49 char *lowerid, *p;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
50 if (!UseFileLogging && !FileLoadLogs) return NULL;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
51
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
52 lowerid = g_strdup(jid);
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
53 for (p=lowerid; *p ; p++)
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
54 *p = tolower(*p);
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
55
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
56 filename = g_new(char, strlen(RootDir) + strlen(jid) + 1);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
57 strcpy(filename, RootDir);
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
58 strcat(filename, lowerid);
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
59 g_free(lowerid);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
60 return filename;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
61 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
62
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
63 // write_histo_line()
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
64 // Adds a history (multi-)line to the jid's history logfile
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
65 static void write_histo_line(const char *jid,
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
66 time_t timestamp, guchar type, guchar info, const char *data)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
67 {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
68 guint len = 0;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
69 FILE *fp;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
70 time_t ts;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
71 const char *p;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
72 char *filename;
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
73 char str_ts[20];
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
74 int err;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
75
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
76 if (!UseFileLogging) return;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
77
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
78 filename = user_histo_file(jid);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
79
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
80 // If timestamp is null, get current date
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
81 if (timestamp)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
82 ts = timestamp;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
83 else
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
84 time(&ts);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
85
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
86 if (!data)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
87 data = "";
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
88
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
89 // Count number of extra lines
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
90 for (p=data ; *p ; p++)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
91 if (*p == '\n') len++;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
92
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
93 /* Line format: "TI yyyymmddThh:mm:ssZ [data]"
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
94 * (Old format: "TI DDDDDDDDDD LLL [data])"
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
95 * T=Type, I=Info, yyyymmddThh:mm:ssZ=date, LLL=0-padded-len
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
96 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
97 * Types:
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
98 * - M message Info: S (send) R (receive)
352
e7e2f2fcc765 Correct a comment
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
99 * - S status Info: [_oifdna]
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
100 * We don't check them, we'll trust the caller.
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
101 */
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
102
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
103 fp = fopen(filename, "a");
155
8a54d46e889a [/trunk] Changeset 167 by mikael
mikael
parents: 118
diff changeset
104 g_free(filename);
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
105 if (!fp) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
106 scr_LogPrint(LPRINT_LOGNORM, "Unable to write history "
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
107 "(cannot open logfile)");
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
108 return;
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
109 }
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
110
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
111 to_iso8601(str_ts, ts);
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
112 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
113 fclose(fp);
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
114 if (err < 0) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
115 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
116 strerror(errno));
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
117 }
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
118 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
119
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
120 // hlog_read_history()
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
121 // Reads the jid's history logfile
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
122 void hlog_read_history(const char *jid, GList **p_buddyhbuf, guint width)
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
123 {
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
124 char *filename;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
125 guchar type, info;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
126 char *data, *tail;
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
127 char *xtext;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
128 time_t timestamp;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
129 guint prefix_flags;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
130 guint len;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
131 FILE *fp;
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
132 struct stat bufstat;
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
133 guint err = 0;
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
134 guint ln = 0; // line number
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
135
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
136 if (!FileLoadLogs) return;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
137
635
d4119cb85aeb New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
138 if ((roster_gettype(jid) & ROSTER_TYPE_ROOM) &&
d4119cb85aeb New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
139 (settings_opt_get_int("load_muc_logs") != 1))
d4119cb85aeb New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
140 return;
d4119cb85aeb New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
141
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
142 data = g_new(char, HBB_BLOCKSIZE+32);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
143 if (!data) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
144 scr_LogPrint(LPRINT_LOGNORM, "Not enough memory to read history file");
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
145 return;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
146 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
147
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
148 filename = user_histo_file(jid);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
149
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
150 fp = fopen(filename, "r");
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
151 g_free(filename);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
152 if (!fp) { g_free(data); return; }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
153
394
4617d0f029ea Update "large file" size value to 3MB
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
154 // 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
155 // (it can take a while...)
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
156 if (!fstat(fileno(fp), &bufstat)) {
394
4617d0f029ea Update "large file" size value to 3MB
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
157 if (bufstat.st_size > 3145728)
4617d0f029ea Update "large file" size value to 3MB
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
158 scr_LogPrint(LPRINT_LOGNORM, "Reading <%s> history file...", jid);
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
159 }
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
160
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
161 /* See write_histo_line() for line format... */
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
162 while (!feof(fp)) {
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
163 guint dataoffset = 25;
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
164 if (fgets(data, HBB_BLOCKSIZE+27, fp) == NULL) break;
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
165 ln++;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
166
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
167 for (tail = data; *tail; tail++) ;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
168
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
169 type = data[0];
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
170 info = data[1];
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
171
395
3e4f2f98c0bf Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents: 394
diff changeset
172 if ((type != 'M' && type != 'S') ||
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
173 ((data[11] != 'T') || (data[20] != 'Z') ||
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
174 (data[21] != ' ') ||
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
175 (data[25] != ' ' && data[26] != ' '))) {
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
176 if (!err) {
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
177 scr_LogPrint(LPRINT_LOGNORM,
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
178 "Error in history file format (%s), l.%u", jid, ln);
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
179 err = 1;
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
180 }
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
181 continue;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
182 }
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
183 // 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
184 if (data[25] != ' ') dataoffset = 26;
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
185 data[21] = data[dataoffset] = 0;
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
186 timestamp = from_iso8601(&data[3], 1);
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
187 len = (guint) atoi(&data[22]);
395
3e4f2f98c0bf Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents: 394
diff changeset
188
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
189 // Some checks
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
190 if (((type == 'M') && (info != 'S' && info != 'R')) ||
277
4d7040cff8ee Remove busy/occupied status, which does not really exist
Mikael Berthe <mikael@lilotux.net>
parents: 273
diff changeset
191 ((type == 'I') && (!strchr("OAIFDN", info)))) {
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
192 if (!err) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
193 scr_LogPrint(LPRINT_LOGNORM, "Error in history file format (%s), l.%u",
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
194 jid, ln);
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
195 err = 1;
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
196 }
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
197 continue;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
198 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
199
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
200 // XXX This will fail when a message is too big
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
201 while (len--) {
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
202 ln++;
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
203 if (fgets(tail, HBB_BLOCKSIZE+27 - (tail-data), fp) == NULL)
249
c3e6e78d1ab4 [/trunk] Changeset 262 by mikael
mikael
parents: 248
diff changeset
204 break;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
205
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
206 while (*tail) tail++;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
207 }
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
208 // Small check for too long messages
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
209 if (tail >= HBB_BLOCKSIZE+dataoffset+1 + data) {
249
c3e6e78d1ab4 [/trunk] Changeset 262 by mikael
mikael
parents: 248
diff changeset
210 // Maybe we will have a parse error on next, because this
c3e6e78d1ab4 [/trunk] Changeset 262 by mikael
mikael
parents: 248
diff changeset
211 // message is big (maybe too big).
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
212 scr_LogPrint(LPRINT_LOGNORM, "A message could be too big "
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
213 "in history file...");
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
214 }
251
806fcdd3b5da [/trunk] Changeset 264 by mikael
mikael
parents: 250
diff changeset
215 // 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
216 if ((tail > data+dataoffset+1) && (*(tail-1) == '\n'))
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
217 *(tail-1) = 0;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
218
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
219 if (type == 'M') {
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
220 char *converted;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
221 if (info == 'S')
729
39f67cade02c Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents: 727
diff changeset
222 prefix_flags = HBB_PREFIX_OUT | HBB_PREFIX_HLIGHT;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
223 else
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
224 prefix_flags = HBB_PREFIX_IN;
795
b16acadd7d53 Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents: 774
diff changeset
225 converted = from_utf8(&data[dataoffset+1]);
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
226 if (converted) {
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
227 xtext = ut_expand_tabs(converted); // Expand tabs
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
228 hbuf_add_line(p_buddyhbuf, xtext, timestamp, prefix_flags, width);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
229 if (xtext != converted)
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
230 g_free(xtext);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
231 g_free(converted);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 729
diff changeset
232 }
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
233 err = 0;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
234 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
235 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
236 fclose(fp);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
237 g_free(data);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
238 }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
239
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
240 // hlog_enable()
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
241 // 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
242 // 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
243 void hlog_enable(guint enable, const char *root_dir, guint loadfiles)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
244 {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
245 UseFileLogging = enable;
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
246 FileLoadLogs = loadfiles;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
247
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
248 if (enable || loadfiles) {
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
249 if (root_dir) {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
250 int l = strlen(root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
251 if (l < 1) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
252 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
253 UseFileLogging = FileLoadLogs = FALSE;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
254 return;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
255 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
256 // RootDir must be slash-terminated
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
257 if (root_dir[l-1] == '/')
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
258 RootDir = g_strdup(root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
259 else {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
260 RootDir = g_new(char, l+2);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
261 strcpy(RootDir, root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
262 strcat(RootDir, "/");
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
263 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
264 } else {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
265 char *home = getenv("HOME");
169
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
266 char *dir = "/.mcabber/histo/";
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
267 RootDir = g_new(char, strlen(home) + strlen(dir) + 1);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
268 strcpy(RootDir, home);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
269 strcat(RootDir, dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
270 }
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
271 // 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
272 if (checkset_perm(RootDir, TRUE) == -1) {
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
273 // The directory does not actually exists
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
274 g_free(RootDir);
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
275 scr_LogPrint(LPRINT_LOGNORM, "ERROR: Cannot access "
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
276 "history log directory, logging DISABLED");
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
277 UseFileLogging = FileLoadLogs = FALSE;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
278 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
279 } else { // Disable history logging
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
280 g_free(RootDir);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
281 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
282 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
283
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
284 inline void hlog_write_message(const char *jid, time_t timestamp, int sent,
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
285 const char *msg)
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
286 {
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
287 write_histo_line(jid, timestamp, 'M', ((sent) ? 'S' : 'R'), msg);
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
288 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
289
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
290 inline void hlog_write_status(const char *jid, time_t timestamp,
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 197
diff changeset
291 enum imstatus status, const char *status_msg)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
292 {
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
293 // #1 XXX Check status value?
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
294 // #2 We could add a user-readable comment
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
295 write_histo_line(jid, timestamp, 'S', toupper(imstatus2char[status]),
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 197
diff changeset
296 status_msg);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
297 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
298
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
299 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */