annotate mcabber/src/hooks.c @ 403:17aa60c6dc63

Allow a different server name than the jid domain name Sync libjabber with upstream (centericq). The libjabber patch is from Ian Johannesen. This allows connecting to Google Talk, for example.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 27 Aug 2005 11:21:27 +0200
parents f8f3c7493457
children b44be19d6229
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
1 /*
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
2 * hooks.c -- Hooks layer
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 391
diff changeset
3 *
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
4 * Copyright (C) 2005 Mikael Berthe <bmikael@lists.lilotux.net>
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
5 *
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or (at
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
9 * your option) any later version.
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
10 *
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful, but
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
14 * General Public License for more details.
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
15 *
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
19 * USA
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
20 */
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
21
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
22 #include <sys/types.h>
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
23 #include <unistd.h>
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
24
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
25 #include "hooks.h"
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
26 #include "screen.h"
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
27 #include "roster.h"
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
28 #include "histolog.h"
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
29 #include "hbuf.h"
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
30
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
31 static char *extcmd;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
32
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
33 inline void hk_message_in(const char *jid, time_t timestamp, const char *msg,
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
34 const char *type)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
35 {
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
36 int new_guy = FALSE;
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
37 int message_flags;
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
38
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
39 // If this user isn't in the roster, we add it
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
40 if (!roster_exists(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT)) {
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
41 roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER);
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
42 new_guy = TRUE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
43 }
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
44
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
45 if (type && !strcmp(type, "error")) {
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
46 message_flags = HBB_PREFIX_ERR | HBB_PREFIX_IN;
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
47 scr_LogPrint(LPRINT_LOGNORM, "Error message received from <%s>", jid);
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
48 } else
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
49 message_flags = 0;
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
50
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 160
diff changeset
51 // Note: the hlog_write should not be called first, because in some
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 160
diff changeset
52 // cases scr_WriteIncomingMessage() will load the history and we'd
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 160
diff changeset
53 // have the message twice...
325
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
54 scr_WriteIncomingMessage(jid, msg, timestamp, message_flags);
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
55 // We don't log the message if it is an error message
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
56 if (!(message_flags & HBB_PREFIX_ERR))
ff6fb51bfd78 Handle "error" message type
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
57 hlog_write_message(jid, timestamp, FALSE, msg);
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
58 // External command
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
59 hk_ext_cmd(jid, 'M', 'R', NULL);
146
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
60 // We need to rebuild the list if the sender is unknown or
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
61 // if the sender is offline/invisible and hide_offline_buddies is set
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
62 if (new_guy ||
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
63 (roster_getstatus(jid) == offline && buddylist_get_hide_offline_buddies()))
50f23c38743a [/trunk] Changeset 158 by mikael
mikael
parents: 141
diff changeset
64 {
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
65 buddylist_build();
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
66 update_roster = TRUE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 120
diff changeset
67 }
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
68 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
69
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
70 inline void hk_message_out(const char *jid, time_t timestamp, const char *msg)
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
71 {
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
72 scr_WriteOutgoingMessage(jid, msg);
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
73 hlog_write_message(jid, timestamp, TRUE, msg);
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
74 // External command
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
75 hk_ext_cmd(jid, 'M', 'S', NULL);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
76 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
77
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 391
diff changeset
78 inline void hk_statuschange(const char *jid, time_t timestamp,
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 213
diff changeset
79 enum imstatus status, const char *status_msg)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
80 {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
81 scr_LogPrint(LPRINT_LOGNORM, "Buddy status has changed: [%c>%c] <%s> %s",
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
82 imstatus2char[roster_getstatus(jid)], imstatus2char[status], jid,
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
83 ((status_msg) ? status_msg : ""));
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 213
diff changeset
84 roster_setstatus(jid, status, status_msg);
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 118
diff changeset
85 buddylist_build();
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 118
diff changeset
86 scr_DrawRoster();
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 213
diff changeset
87 hlog_write_status(jid, 0, status, status_msg);
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
88 // External command
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
89 hk_ext_cmd(jid, 'S', imstatus2char[status], NULL);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
90 }
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents:
diff changeset
91
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
92 inline void hk_mystatuschange(time_t timestamp,
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
93 enum imstatus old_status, enum imstatus new_status, const char *msg)
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
94 {
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
95 if (!msg && (old_status == new_status))
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
96 return;
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
97
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
98 scr_LogPrint(LPRINT_LOGNORM, "Your status has changed: [%c>%c] %s",
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
99 imstatus2char[old_status], imstatus2char[new_status],
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
100 ((msg) ? msg : ""));
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
101 //hlog_write_status(NULL, 0, status);
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
102 }
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 115
diff changeset
103
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
104
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
105 /* External commands */
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
106
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
107 // hk_ext_cmd_init()
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
108 // Initialize external command variable.
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
109 // Can be called with parameter NULL to reset and free memory.
281
f562b9af2de7 Add "const" specifier in prototypes
Mikael Berthe <mikael@lilotux.net>
parents: 221
diff changeset
110 void hk_ext_cmd_init(const char *command)
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
111 {
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
112 if (extcmd) {
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
113 g_free(extcmd);
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
114 extcmd = NULL;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
115 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
116 if (command)
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
117 extcmd = g_strdup(command);
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
118 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
119
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
120 // hk_ext_cmd()
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
121 // Launch an external command (process) for the given event.
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
122 // For now, data should be NULL.
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
123 void hk_ext_cmd(const char *jid, guchar type, guchar info, const char *data)
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
124 {
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
125 pid_t pid;
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
126 char *arg_type = NULL;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
127 char *arg_info = NULL;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
128 char *arg_data = NULL;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
129 char status_str[2];
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
130
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
131 if (!extcmd) return;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
132
355
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
133 // Prepare arg_* (external command parameters)
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
134 switch (type) {
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
135 case 'M':
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
136 arg_type = "MSG";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
137 if (info == 'R')
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
138 arg_info = "IN";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
139 else if (info == 'S')
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
140 arg_info = "OUT";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
141
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
142 break;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
143 case 'S':
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
144 arg_type = "STATUS";
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
145 if (strchr(imstatus2char, tolower(info))) {
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
146 status_str[0] = toupper(info);
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
147 status_str[1] = 0;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
148 arg_info = status_str;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
149 }
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
150 break;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
151 default:
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
152 return;
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
153 }
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
154
c5a7a7273986 Add some external actions
Mikael Berthe <mikael@lilotux.net>
parents: 325
diff changeset
155 if (!arg_type || !arg_info) return;
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
156
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
157 if ((pid=fork()) == -1) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
158 scr_LogPrint(LPRINT_LOGNORM, "Fork error, cannot launch external command.");
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
159 return;
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
160 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
161
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
162 if (pid == 0) { // child
391
868a350fefca Fix "missing sentinel in function call" warning with gcc4
Mikael Berthe <mikael@lilotux.net>
parents: 384
diff changeset
163 if (execl(extcmd, extcmd, arg_type, arg_info, jid, arg_data, NULL) == -1) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
164 // scr_LogPrint(LPRINT_LOGNORM, "Cannot execute external command.");
160
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
165 exit(1);
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
166 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
167 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
168 }
44c6410b4845 [/trunk] Changeset 172 by mikael
mikael
parents: 146
diff changeset
169