annotate mcabber/src/histolog.c @ 147:7571de4aed73

[/trunk] Changeset 159 by mikael * Fix a bug in buddylist_build() * We now lock the current buddy even not when being in chat mode. For example, if we're writing to s.o. and he leaves just before we press enter, we won't write to the wrong buddy... If the current_buddy is a group, we lock it too. * Remove MCABBER_TESTUNIT ifdef in roster.h (test program isn't up-to-date anymore...)
author mikael
date Fri, 29 Apr 2005 19:56:28 +0000
parents 1e8f646e2c5b
children 8a54d46e889a
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 /*
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
2 * histolog.c -- File history handling
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
3 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
4 * Copyright (C) 2005 Mikael Berthe <bmikael@lists.lilotux.net>
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"
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
31 #include "jabglue.h"
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
32 #include "screen.h"
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
33
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
34 static guint UseFileLogging;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
35 static char *RootDir;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
36
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
37
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
38 // user_histo_file()
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
39 // Returns history filename for the given jid
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
40 // Note: the caller *must* free the filename after use (if not null).
111
d896962c16fa [/trunk] Changeset 125 by mikael
mikael
parents: 110
diff changeset
41 static char *user_histo_file(const char *jid)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
42 {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
43 char *filename;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
44 if (!UseFileLogging)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
45 return NULL;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
46
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
47 filename = g_new(char, strlen(RootDir) + strlen(jid) + 1);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
48 strcpy(filename, RootDir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
49 strcat(filename, jid);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
50 return filename;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
51 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
52
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
53 // write()
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
54 // Adds a history (multi-)line to the jid's history logfile
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
55 static void write_histo_line(const char *jid,
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
56 time_t timestamp, guchar type, guchar info, const char *data)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
57 {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
58 guint len = 0;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
59 FILE *fp;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
60 time_t ts;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
61 const char *p;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
62 char *filename = user_histo_file(jid);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
63
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
64 if (!filename)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
65 return;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
66
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
67 // If timestamp is null, get current date
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
68 if (timestamp)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
69 ts = timestamp;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
70 else
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
71 time(&ts);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
72
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
73 if (!data)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
74 data = "";
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
75
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
76 // Count number of extra lines
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
77 for (p=data ; *p ; p++)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
78 if (*p == '\n') len++;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
79
118
1e8f646e2c5b [/trunk] Changeset 131 by mikael
mikael
parents: 113
diff changeset
80 /* Line format: "TI DDDDDDDDDD LLL [data]"
1e8f646e2c5b [/trunk] Changeset 131 by mikael
mikael
parents: 113
diff changeset
81 * T=Type, I=Info, DDDDDDDDDD=date, LLL=0-padded-len
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
82 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
83 * Types:
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
84 * - M message Info: S (send) R (receive)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
85 * - S status Info: [oaifdcn]
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
86 * We don't check them, we'll trust the caller.
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
87 */
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
88
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
89 fp = fopen(filename, "a");
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
90 if (!fp)
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
91 return;
118
1e8f646e2c5b [/trunk] Changeset 131 by mikael
mikael
parents: 113
diff changeset
92 fprintf(fp, "%c%c %10u %03d %s\n", type, info, (unsigned int)ts, len, data);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
93 fclose(fp);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
94 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
95
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
96 // hlog_enable()
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
97 // Enable logging to files. If root_dir is NULL, then $HOME/.mcabber is used.
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
98 void hlog_enable(guint enable, char *root_dir)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
99 {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
100 UseFileLogging = enable;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
101
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
102 if (enable) {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
103 if (root_dir) {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
104 int l = strlen(root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
105 if (l < 1) {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
106 scr_LogPrint("root_dir too short");
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
107 UseFileLogging = FALSE;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
108 return;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
109 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
110 // RootDir must be slash-terminated
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
111 if (root_dir[l-1] == '/')
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
112 RootDir = g_strdup(root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
113 else {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
114 RootDir = g_new(char, l+2);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
115 strcpy(RootDir, root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
116 strcat(RootDir, "/");
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
117 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
118 } else {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
119 char *home = getenv("HOME");
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
120 char *dir = "/.mcabber/";
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
121 RootDir = g_new(char, strlen(home) + strlen(dir) + 1);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
122 strcpy(RootDir, home);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
123 strcat(RootDir, dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
124 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
125 // FIXME
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
126 // We should check the directory actually exists
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
127 } else // Disable history logging
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
128 if (RootDir) {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
129 g_free(RootDir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
130 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
131 }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
132
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
133 inline void hlog_write_message(const char *jid, time_t timestamp, int sent,
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
134 const char *msg)
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
135 {
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
136 write_histo_line(jid, timestamp, 'M', ((sent) ? 'S' : 'R'), msg);
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
137 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
138
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
139 inline void hlog_write_status(const char *jid, time_t timestamp,
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
140 enum imstatus status)
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
141 {
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
142 // #1 XXX Check status value?
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
143 // #2 We could add a user-readable comment
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
144 write_histo_line(jid, timestamp, 'S', toupper(imstatus2char[status]),
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
145 NULL);
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
146 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
147