summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/mime/mailmime_decode.c3
-rw-r--r--kmicromail/libmailwrapper/generatemail.cpp13
-rw-r--r--kmicromail/libmailwrapper/imapwrapper.cpp7
-rw-r--r--kmicromail/libmailwrapper/settings.cpp3
-rw-r--r--kmicromail/opiemail.cpp11
-rw-r--r--libkdepim/kprefswidget.cpp1
6 files changed, 25 insertions, 13 deletions
diff --git a/kmicromail/libetpan/mime/mailmime_decode.c b/kmicromail/libetpan/mime/mailmime_decode.c
index e48ec19..dbaeb68 100644
--- a/kmicromail/libetpan/mime/mailmime_decode.c
+++ b/kmicromail/libetpan/mime/mailmime_decode.c
@@ -1,543 +1,544 @@
1/* 1/*
2 * libEtPan! -- a mail stuff library 2 * libEtPan! -- a mail stuff library
3 * 3 *
4 * Copyright (C) 2001, 2002 - DINH Viet Hoa 4 * Copyright (C) 2001, 2002 - DINH Viet Hoa
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the libEtPan! project nor the names of its 15 * 3. Neither the name of the libEtPan! project nor the names of its
16 * contributors may be used to endorse or promote products derived 16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission. 17 * from this software without specific prior written permission.
18 * 18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE. 29 * SUCH DAMAGE.
30 */ 30 */
31 31
32/* 32/*
33 * $Id$ 33 * $Id$
34 */ 34 */
35 35
36/* 36/*
37 RFC 2047 : MIME (Multipurpose Internet Mail Extensions) Part Three: 37 RFC 2047 : MIME (Multipurpose Internet Mail Extensions) Part Three:
38 Message Header Extensions for Non-ASCII Text 38 Message Header Extensions for Non-ASCII Text
39*/ 39*/
40 40
41#include "mailmime_decode.h" 41#include "mailmime_decode.h"
42 42
43#include <ctype.h> 43#include <ctype.h>
44#include <unistd.h> 44#include <unistd.h>
45#include <sys/mman.h> 45#include <sys/mman.h>
46#include <string.h> 46#include <string.h>
47#include <stdlib.h> 47#include <stdlib.h>
48 48
49#include "mailmime_content.h" 49#include "mailmime_content.h"
50 50
51#include "charconv.h" 51#include "charconv.h"
52#include "mmapstring.h" 52#include "mmapstring.h"
53#include "mailimf.h" 53#include "mailimf.h"
54 54
55#ifndef TRUE 55#ifndef TRUE
56#define TRUE 1 56#define TRUE 1
57#endif 57#endif
58 58
59#ifndef FALSE 59#ifndef FALSE
60#define FALSE 0 60#define FALSE 0
61#endif 61#endif
62 62
63static int mailmime_charset_parse(const char * message, size_t length, 63static int mailmime_charset_parse(const char * message, size_t length,
64 size_t * index, char ** charset); 64 size_t * index, char ** charset);
65 65
66enum { 66enum {
67 MAILMIME_ENCODING_B, 67 MAILMIME_ENCODING_B,
68 MAILMIME_ENCODING_Q 68 MAILMIME_ENCODING_Q
69}; 69};
70 70
71static int mailmime_encoding_parse(const char * message, size_t length, 71static int mailmime_encoding_parse(const char * message, size_t length,
72 size_t * index, int * result); 72 size_t * index, int * result);
73 73
74static int mailmime_etoken_parse(const char * message, size_t length, 74static int mailmime_etoken_parse(const char * message, size_t length,
75 size_t * index, char ** result); 75 size_t * index, char ** result);
76 76
77static int 77static int
78mailmime_non_encoded_word_parse(const char * message, size_t length, 78mailmime_non_encoded_word_parse(const char * message, size_t length,
79 size_t * index, 79 size_t * index,
80 char ** result); 80 char ** result);
81 81
82static int 82static int
83mailmime_encoded_word_parse(const char * message, size_t length, 83mailmime_encoded_word_parse(const char * message, size_t length,
84 size_t * index, 84 size_t * index,
85 struct mailmime_encoded_word ** result); 85 struct mailmime_encoded_word ** result);
86 86
87 87
88enum { 88enum {
89 TYPE_ERROR, 89 TYPE_ERROR,
90 TYPE_WORD, 90 TYPE_WORD,
91 TYPE_ENCODED_WORD, 91 TYPE_ENCODED_WORD,
92}; 92};
93 93
94int mailmime_encoded_phrase_parse(const char * default_fromcode, 94int mailmime_encoded_phrase_parse(const char * default_fromcode,
95 const char * message, size_t length, 95 const char * message, size_t length,
96 size_t * index, const char * tocode, 96 size_t * index, const char * tocode,
97 char ** result) 97 char ** result)
98{ 98{
99 MMAPString * gphrase; 99 MMAPString * gphrase;
100 struct mailmime_encoded_word * word; 100 struct mailmime_encoded_word * word;
101 int first; 101 int first;
102 size_t cur_token; 102 size_t cur_token;
103 int r; 103 int r;
104 int res; 104 int res;
105 char * str; 105 char * str;
106 char * wordutf8; 106 char * wordutf8;
107 int type; 107 int type;
108 108
109 cur_token = * index; 109 cur_token = * index;
110 110
111 gphrase = mmap_string_new(""); 111 gphrase = mmap_string_new("");
112 if (gphrase == NULL) { 112 if (gphrase == NULL) {
113 res = MAILIMF_ERROR_MEMORY; 113 res = MAILIMF_ERROR_MEMORY;
114 goto err; 114 goto err;
115 } 115 }
116 116
117 first = TRUE; 117 first = TRUE;
118 118
119 type = TYPE_ERROR; /* XXX - removes a gcc warning */ 119 type = TYPE_ERROR; /* XXX - removes a gcc warning */
120 120
121 while (1) { 121 while (1) {
122 122
123 r = mailmime_encoded_word_parse(message, length, &cur_token, &word); 123 r = mailmime_encoded_word_parse(message, length, &cur_token, &word);
124 if (r == MAILIMF_NO_ERROR) { 124 if (r == MAILIMF_NO_ERROR) {
125 if (!first) { 125 if (!first) {
126 if (type != TYPE_ENCODED_WORD) { 126 if (type != TYPE_ENCODED_WORD) {
127 if (mmap_string_append_c(gphrase, ' ') == NULL) { 127 if (mmap_string_append_c(gphrase, ' ') == NULL) {
128 mailmime_encoded_word_free(word); 128 mailmime_encoded_word_free(word);
129 res = MAILIMF_ERROR_MEMORY; 129 res = MAILIMF_ERROR_MEMORY;
130 goto free; 130 goto free;
131 } 131 }
132 } 132 }
133 } 133 }
134 type = TYPE_ENCODED_WORD; 134 type = TYPE_ENCODED_WORD;
135 wordutf8 = NULL; 135 wordutf8 = NULL;
136 r = charconv(tocode, word->wd_charset, word->wd_text, 136 r = charconv(tocode, word->wd_charset, word->wd_text,
137 strlen(word->wd_text), &wordutf8); 137 strlen(word->wd_text), &wordutf8);
138 switch (r) { 138 switch (r) {
139 case MAIL_CHARCONV_ERROR_MEMORY: 139 case MAIL_CHARCONV_ERROR_MEMORY:
140 mailmime_encoded_word_free(word); 140 mailmime_encoded_word_free(word);
141 res = MAILIMF_ERROR_MEMORY; 141 res = MAILIMF_ERROR_MEMORY;
142 goto free; 142 goto free;
143 143
144 case MAIL_CHARCONV_ERROR_UNKNOWN_CHARSET: 144 case MAIL_CHARCONV_ERROR_UNKNOWN_CHARSET:
145 case MAIL_CHARCONV_ERROR_CONV: 145 case MAIL_CHARCONV_ERROR_CONV:
146 mailmime_encoded_word_free(word); 146 mailmime_encoded_word_free(word);
147 res = MAILIMF_ERROR_PARSE; 147 res = MAILIMF_ERROR_PARSE;
148 goto free; 148 goto free;
149 } 149 }
150 150
151 if (wordutf8 != NULL) { 151 if (wordutf8 != NULL) {
152 if (mmap_string_append(gphrase, wordutf8) == NULL) { 152 if (mmap_string_append(gphrase, wordutf8) == NULL) {
153 mailmime_encoded_word_free(word); 153 mailmime_encoded_word_free(word);
154 free(wordutf8); 154 free(wordutf8);
155 res = MAILIMF_ERROR_MEMORY; 155 res = MAILIMF_ERROR_MEMORY;
156 goto free; 156 goto free;
157 } 157 }
158 free(wordutf8); 158 free(wordutf8);
159 } 159 }
160 mailmime_encoded_word_free(word); 160 mailmime_encoded_word_free(word);
161 first = FALSE; 161 first = FALSE;
162 } 162 }
163 else if (r == MAILIMF_ERROR_PARSE) { 163 else if (r == MAILIMF_ERROR_PARSE) {
164 /* do nothing */ 164 /* do nothing */
165 } 165 }
166 else { 166 else {
167 res = r; 167 res = r;
168 goto free; 168 goto free;
169 } 169 }
170 170
171 if (r == MAILIMF_ERROR_PARSE) { 171 if (r == MAILIMF_ERROR_PARSE) {
172 char * raw_word; 172 char * raw_word;
173 173
174 r = mailmime_non_encoded_word_parse(message, length, 174 r = mailmime_non_encoded_word_parse(message, length,
175 &cur_token, &raw_word); 175 &cur_token, &raw_word);
176 if (r == MAILIMF_NO_ERROR) { 176 if (r == MAILIMF_NO_ERROR) {
177 if (!first) { 177 if (!first) {
178 if (mmap_string_append_c(gphrase, ' ') == NULL) { 178 if (mmap_string_append_c(gphrase, ' ') == NULL) {
179 free(raw_word); 179 free(raw_word);
180 res = MAILIMF_ERROR_MEMORY; 180 res = MAILIMF_ERROR_MEMORY;
181 goto free; 181 goto free;
182 } 182 }
183 } 183 }
184 type = TYPE_WORD; 184 type = TYPE_WORD;
185 185
186 wordutf8 = NULL; 186 wordutf8 = NULL;
187 r = charconv(tocode, default_fromcode, raw_word, 187 r = charconv(tocode, default_fromcode, raw_word,
188 strlen(raw_word), &wordutf8); 188 strlen(raw_word), &wordutf8);
189 189
190 switch (r) { 190 switch (r) {
191 case MAIL_CHARCONV_ERROR_MEMORY: 191 case MAIL_CHARCONV_ERROR_MEMORY:
192 free(raw_word); 192 free(raw_word);
193 res = MAILIMF_ERROR_MEMORY; 193 res = MAILIMF_ERROR_MEMORY;
194 goto free; 194 goto free;
195 195
196 case MAIL_CHARCONV_ERROR_UNKNOWN_CHARSET: 196 case MAIL_CHARCONV_ERROR_UNKNOWN_CHARSET:
197 case MAIL_CHARCONV_ERROR_CONV: 197 case MAIL_CHARCONV_ERROR_CONV:
198 free(raw_word); 198 free(raw_word);
199 res = MAILIMF_ERROR_PARSE; 199 res = MAILIMF_ERROR_PARSE;
200 goto free; 200 goto free;
201 } 201 }
202 202
203 if (mmap_string_append(gphrase, wordutf8) == NULL) { 203 if (mmap_string_append(gphrase, wordutf8) == NULL) {
204 free(wordutf8); 204 free(wordutf8);
205 free(raw_word); 205 free(raw_word);
206 res = MAILIMF_ERROR_MEMORY; 206 res = MAILIMF_ERROR_MEMORY;
207 goto free; 207 goto free;
208 } 208 }
209 209 // LUTZ fix
210 free(wordutf8);
210 free(raw_word); 211 free(raw_word);
211 first = FALSE; 212 first = FALSE;
212 } 213 }
213 else if (r == MAILIMF_ERROR_PARSE) { 214 else if (r == MAILIMF_ERROR_PARSE) {
214 break; 215 break;
215 } 216 }
216 else { 217 else {
217 res = r; 218 res = r;
218 goto free; 219 goto free;
219 } 220 }
220 } 221 }
221 } 222 }
222 223
223 if (first) { 224 if (first) {
224 res = MAILIMF_ERROR_PARSE; 225 res = MAILIMF_ERROR_PARSE;
225 goto free; 226 goto free;
226 } 227 }
227 228
228 str = strdup(gphrase->str); 229 str = strdup(gphrase->str);
229 if (str == NULL) { 230 if (str == NULL) {
230 res = MAILIMF_ERROR_MEMORY; 231 res = MAILIMF_ERROR_MEMORY;
231 goto free; 232 goto free;
232 } 233 }
233 mmap_string_free(gphrase); 234 mmap_string_free(gphrase);
234 235
235 * result = str; 236 * result = str;
236 * index = cur_token; 237 * index = cur_token;
237 238
238 return MAILIMF_NO_ERROR; 239 return MAILIMF_NO_ERROR;
239 240
240 free: 241 free:
241 mmap_string_free(gphrase); 242 mmap_string_free(gphrase);
242 err: 243 err:
243 return res; 244 return res;
244} 245}
245 246
246static int 247static int
247mailmime_non_encoded_word_parse(const char * message, size_t length, 248mailmime_non_encoded_word_parse(const char * message, size_t length,
248 size_t * index, 249 size_t * index,
249 char ** result) 250 char ** result)
250{ 251{
251 int end; 252 int end;
252 size_t cur_token; 253 size_t cur_token;
253 int res; 254 int res;
254 char * text; 255 char * text;
255 int r; 256 int r;
256 size_t begin; 257 size_t begin;
257 258
258 cur_token = * index; 259 cur_token = * index;
259 260
260 r = mailimf_fws_parse(message, length, &cur_token); 261 r = mailimf_fws_parse(message, length, &cur_token);
261 if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) { 262 if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
262 res = r; 263 res = r;
263 goto err; 264 goto err;
264 } 265 }
265 266
266 begin = cur_token; 267 begin = cur_token;
267 268
268 end = FALSE; 269 end = FALSE;
269 while (1) { 270 while (1) {
270 if (cur_token >= length) 271 if (cur_token >= length)
271 break; 272 break;
272 273
273 switch (message[cur_token]) { 274 switch (message[cur_token]) {
274 case ' ': 275 case ' ':
275 case '\t': 276 case '\t':
276 case '\r': 277 case '\r':
277 case '\n': 278 case '\n':
278 end = TRUE; 279 end = TRUE;
279 break; 280 break;
280 } 281 }
281 282
282 if (end) 283 if (end)
283 break; 284 break;
284 285
285 cur_token ++; 286 cur_token ++;
286 } 287 }
287 288
288 if (cur_token - begin == 0) { 289 if (cur_token - begin == 0) {
289 res = MAILIMF_ERROR_PARSE; 290 res = MAILIMF_ERROR_PARSE;
290 goto err; 291 goto err;
291 } 292 }
292 293
293 text = malloc(cur_token - begin + 1); 294 text = malloc(cur_token - begin + 1);
294 if (text == NULL) { 295 if (text == NULL) {
295 res = MAILIMF_ERROR_MEMORY; 296 res = MAILIMF_ERROR_MEMORY;
296 goto err; 297 goto err;
297 } 298 }
298 299
299 memcpy(text, message + begin, cur_token - begin); 300 memcpy(text, message + begin, cur_token - begin);
300 text[cur_token - begin] = '\0'; 301 text[cur_token - begin] = '\0';
301 302
302 * index = cur_token; 303 * index = cur_token;
303 * result = text; 304 * result = text;
304 305
305 return MAILIMF_NO_ERROR; 306 return MAILIMF_NO_ERROR;
306 307
307 err: 308 err:
308 return res; 309 return res;
309} 310}
310 311
311static int mailmime_encoded_word_parse(const char * message, size_t length, 312static int mailmime_encoded_word_parse(const char * message, size_t length,
312 size_t * index, 313 size_t * index,
313 struct mailmime_encoded_word ** result) 314 struct mailmime_encoded_word ** result)
314{ 315{
315 size_t cur_token; 316 size_t cur_token;
316 char * charset; 317 char * charset;
317 int encoding; 318 int encoding;
318 char * text; 319 char * text;
319 size_t end_encoding; 320 size_t end_encoding;
320 char * decoded; 321 char * decoded;
321 size_t decoded_len; 322 size_t decoded_len;
322 struct mailmime_encoded_word * ew; 323 struct mailmime_encoded_word * ew;
323 int r; 324 int r;
324 int res; 325 int res;
325 int opening_quote; 326 int opening_quote;
326 int end; 327 int end;
327 328
328 cur_token = * index; 329 cur_token = * index;
329 330
330 r = mailimf_fws_parse(message, length, &cur_token); 331 r = mailimf_fws_parse(message, length, &cur_token);
331 if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) { 332 if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
332 res = r; 333 res = r;
333 goto err; 334 goto err;
334 } 335 }
335 336
336 opening_quote = FALSE; 337 opening_quote = FALSE;
337 r = mailimf_char_parse(message, length, &cur_token, '\"'); 338 r = mailimf_char_parse(message, length, &cur_token, '\"');
338 if (r == MAILIMF_NO_ERROR) { 339 if (r == MAILIMF_NO_ERROR) {
339 opening_quote = TRUE; 340 opening_quote = TRUE;
340 } 341 }
341 else if (r == MAILIMF_ERROR_PARSE) { 342 else if (r == MAILIMF_ERROR_PARSE) {
342 /* do nothing */ 343 /* do nothing */
343 } 344 }
344 else { 345 else {
345 res = r; 346 res = r;
346 goto err; 347 goto err;
347 } 348 }
348 349
349 r = mailimf_token_case_insensitive_parse(message, length, &cur_token, "=?"); 350 r = mailimf_token_case_insensitive_parse(message, length, &cur_token, "=?");
350 if (r != MAILIMF_NO_ERROR) { 351 if (r != MAILIMF_NO_ERROR) {
351 res = r; 352 res = r;
352 goto err; 353 goto err;
353 } 354 }
354 355
355 r = mailmime_charset_parse(message, length, &cur_token, &charset); 356 r = mailmime_charset_parse(message, length, &cur_token, &charset);
356 if (r != MAILIMF_NO_ERROR) { 357 if (r != MAILIMF_NO_ERROR) {
357 res = r; 358 res = r;
358 goto err; 359 goto err;
359 } 360 }
360 361
361 r = mailimf_char_parse(message, length, &cur_token, '?'); 362 r = mailimf_char_parse(message, length, &cur_token, '?');
362 if (r != MAILIMF_NO_ERROR) { 363 if (r != MAILIMF_NO_ERROR) {
363 res = r; 364 res = r;
364 goto free_charset; 365 goto free_charset;
365 } 366 }
366 367
367 r = mailmime_encoding_parse(message, length, &cur_token, &encoding); 368 r = mailmime_encoding_parse(message, length, &cur_token, &encoding);
368 if (r != MAILIMF_NO_ERROR) { 369 if (r != MAILIMF_NO_ERROR) {
369 res = r; 370 res = r;
370 goto free_charset; 371 goto free_charset;
371 } 372 }
372 373
373 r = mailimf_char_parse(message, length, &cur_token, '?'); 374 r = mailimf_char_parse(message, length, &cur_token, '?');
374 if (r != MAILIMF_NO_ERROR) { 375 if (r != MAILIMF_NO_ERROR) {
375 res = r; 376 res = r;
376 goto free_charset; 377 goto free_charset;
377 } 378 }
378 379
379 end = FALSE; 380 end = FALSE;
380 end_encoding = cur_token; 381 end_encoding = cur_token;
381 while (1) { 382 while (1) {
382 if (end_encoding >= length) 383 if (end_encoding >= length)
383 break; 384 break;
384 385
385 switch (message[end_encoding]) { 386 switch (message[end_encoding]) {
386 case '?': 387 case '?':
387#if 0 388#if 0
388 case ' ': 389 case ' ':
389#endif 390#endif
390 end = TRUE; 391 end = TRUE;
391 break; 392 break;
392 } 393 }
393 394
394 if (end) 395 if (end)
395 break; 396 break;
396 397
397 end_encoding ++; 398 end_encoding ++;
398 } 399 }
399 400
400 decoded_len = 0; 401 decoded_len = 0;
401 decoded = NULL; 402 decoded = NULL;
402 switch (encoding) { 403 switch (encoding) {
403 case MAILMIME_ENCODING_B: 404 case MAILMIME_ENCODING_B:
404 r = mailmime_base64_body_parse(message, end_encoding, 405 r = mailmime_base64_body_parse(message, end_encoding,
405 &cur_token, &decoded, 406 &cur_token, &decoded,
406 &decoded_len); 407 &decoded_len);
407 408
408 if (r != MAILIMF_NO_ERROR) { 409 if (r != MAILIMF_NO_ERROR) {
409 res = r; 410 res = r;
410 goto free_charset; 411 goto free_charset;
411 } 412 }
412 break; 413 break;
413 case MAILMIME_ENCODING_Q: 414 case MAILMIME_ENCODING_Q:
414 r = mailmime_quoted_printable_body_parse(message, end_encoding, 415 r = mailmime_quoted_printable_body_parse(message, end_encoding,
415 &cur_token, &decoded, 416 &cur_token, &decoded,
416 &decoded_len, TRUE); 417 &decoded_len, TRUE);
417 418
418 if (r != MAILIMF_NO_ERROR) { 419 if (r != MAILIMF_NO_ERROR) {
419 res = r; 420 res = r;
420 goto free_charset; 421 goto free_charset;
421 } 422 }
422 423
423 break; 424 break;
424 } 425 }
425 426
426 text = malloc(decoded_len + 1); 427 text = malloc(decoded_len + 1);
427 if (text == NULL) { 428 if (text == NULL) {
428 res = MAILIMF_ERROR_MEMORY; 429 res = MAILIMF_ERROR_MEMORY;
429 goto free_charset; 430 goto free_charset;
430 } 431 }
431 432
432 if (decoded_len > 0) 433 if (decoded_len > 0)
433 memcpy(text, decoded, decoded_len); 434 memcpy(text, decoded, decoded_len);
434 text[decoded_len] = '\0'; 435 text[decoded_len] = '\0';
435 436
436 mailmime_decoded_part_free(decoded); 437 mailmime_decoded_part_free(decoded);
437 438
438 r = mailimf_token_case_insensitive_parse(message, length, &cur_token, "?="); 439 r = mailimf_token_case_insensitive_parse(message, length, &cur_token, "?=");
439 if (r != MAILIMF_NO_ERROR) { 440 if (r != MAILIMF_NO_ERROR) {
440 res = r; 441 res = r;
441 goto free_encoded_text; 442 goto free_encoded_text;
442 } 443 }
443 444
444 if (opening_quote) { 445 if (opening_quote) {
445 r = mailimf_char_parse(message, length, &cur_token, '\"'); 446 r = mailimf_char_parse(message, length, &cur_token, '\"');
446 if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) { 447 if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
447 res = r; 448 res = r;
448 goto free_encoded_text; 449 goto free_encoded_text;
449 } 450 }
450 } 451 }
451 452
452 ew = mailmime_encoded_word_new(charset, text); 453 ew = mailmime_encoded_word_new(charset, text);
453 if (ew == NULL) { 454 if (ew == NULL) {
454 res = MAILIMF_ERROR_MEMORY; 455 res = MAILIMF_ERROR_MEMORY;
455 goto free_encoded_text; 456 goto free_encoded_text;
456 } 457 }
457 458
458 * result = ew; 459 * result = ew;
459 * index = cur_token; 460 * index = cur_token;
460 461
461 return MAILIMF_NO_ERROR; 462 return MAILIMF_NO_ERROR;
462 463
463 free_encoded_text: 464 free_encoded_text:
464 mailmime_encoded_text_free(text); 465 mailmime_encoded_text_free(text);
465 free_charset: 466 free_charset:
466 mailmime_charset_free(charset); 467 mailmime_charset_free(charset);
467 err: 468 err:
468 return res; 469 return res;
469} 470}
470 471
471static int mailmime_charset_parse(const char * message, size_t length, 472static int mailmime_charset_parse(const char * message, size_t length,
472 size_t * index, char ** charset) 473 size_t * index, char ** charset)
473{ 474{
474 return mailmime_etoken_parse(message, length, index, charset); 475 return mailmime_etoken_parse(message, length, index, charset);
475} 476}
476 477
477static int mailmime_encoding_parse(const char * message, size_t length, 478static int mailmime_encoding_parse(const char * message, size_t length,
478 size_t * index, int * result) 479 size_t * index, int * result)
479{ 480{
480 size_t cur_token; 481 size_t cur_token;
481 int encoding; 482 int encoding;
482 483
483 cur_token = * index; 484 cur_token = * index;
484 485
485 if (cur_token >= length) 486 if (cur_token >= length)
486 return MAILIMF_ERROR_PARSE; 487 return MAILIMF_ERROR_PARSE;
487 488
488 switch ((char) toupper((unsigned char) message[cur_token])) { 489 switch ((char) toupper((unsigned char) message[cur_token])) {
489 case 'Q': 490 case 'Q':
490 encoding = MAILMIME_ENCODING_Q; 491 encoding = MAILMIME_ENCODING_Q;
491 break; 492 break;
492 case 'B': 493 case 'B':
493 encoding = MAILMIME_ENCODING_B; 494 encoding = MAILMIME_ENCODING_B;
494 break; 495 break;
495 default: 496 default:
496 return MAILIMF_ERROR_INVAL; 497 return MAILIMF_ERROR_INVAL;
497 } 498 }
498 499
499 cur_token ++; 500 cur_token ++;
500 501
501 * result = encoding; 502 * result = encoding;
502 * index = cur_token; 503 * index = cur_token;
503 504
504 return MAILIMF_NO_ERROR; 505 return MAILIMF_NO_ERROR;
505} 506}
506 507
507int is_etoken_char(char ch) 508int is_etoken_char(char ch)
508{ 509{
509 unsigned char uch = ch; 510 unsigned char uch = ch;
510 511
511 if (uch < 31) 512 if (uch < 31)
512 return FALSE; 513 return FALSE;
513 514
514 switch (uch) { 515 switch (uch) {
515 case ' ': 516 case ' ':
516 case '(': 517 case '(':
517 case ')': 518 case ')':
518 case '<': 519 case '<':
519 case '>': 520 case '>':
520 case '@': 521 case '@':
521 case ',': 522 case ',':
522 case ';': 523 case ';':
523 case ':': 524 case ':':
524 case '"': 525 case '"':
525 case '/': 526 case '/':
526 case '[': 527 case '[':
527 case ']': 528 case ']':
528 case '?': 529 case '?':
529 case '.': 530 case '.':
530 case '=': 531 case '=':
531 return FALSE; 532 return FALSE;
532 } 533 }
533 534
534 return TRUE; 535 return TRUE;
535} 536}
536 537
537static int mailmime_etoken_parse(const char * message, size_t length, 538static int mailmime_etoken_parse(const char * message, size_t length,
538 size_t * index, char ** result) 539 size_t * index, char ** result)
539{ 540{
540 return mailimf_custom_string_parse(message, length, 541 return mailimf_custom_string_parse(message, length,
541 index, result, 542 index, result,
542 is_etoken_char); 543 is_etoken_char);
543} 544}
diff --git a/kmicromail/libmailwrapper/generatemail.cpp b/kmicromail/libmailwrapper/generatemail.cpp
index 49315ba..32311d7 100644
--- a/kmicromail/libmailwrapper/generatemail.cpp
+++ b/kmicromail/libmailwrapper/generatemail.cpp
@@ -1,460 +1,461 @@
1#include "generatemail.h" 1#include "generatemail.h"
2#include "mailwrapper.h" 2#include "mailwrapper.h"
3 3
4#include <libetpan/libetpan.h> 4#include <libetpan/libetpan.h>
5 5
6//#include <qt.h> 6//#include <qt.h>
7 7
8#include <stdlib.h> 8#include <stdlib.h>
9#include <qfileinfo.h> 9#include <qfileinfo.h>
10 10
11using namespace Opie::Core; 11using namespace Opie::Core;
12const char* Generatemail::USER_AGENT="OpieMail v0.6"; 12const char* Generatemail::USER_AGENT="KOpieMail 33 1/3";
13 13
14Generatemail::Generatemail() 14Generatemail::Generatemail()
15{ 15{
16} 16}
17 17
18Generatemail::~Generatemail() 18Generatemail::~Generatemail()
19{ 19{
20} 20}
21 21
22void Generatemail::addRcpts( clist *list, mailimf_address_list *addr_list ) { 22void Generatemail::addRcpts( clist *list, mailimf_address_list *addr_list ) {
23 clistiter *it, *it2; 23 clistiter *it, *it2;
24 24
25 for ( it = clist_begin( addr_list->ad_list ); it; it = it->next ) { 25 for ( it = clist_begin( addr_list->ad_list ); it; it = it->next ) {
26 mailimf_address *addr; 26 mailimf_address *addr;
27 addr = (mailimf_address *) it->data; 27 addr = (mailimf_address *) it->data;
28 28
29 if ( addr->ad_type == MAILIMF_ADDRESS_MAILBOX ) { 29 if ( addr->ad_type == MAILIMF_ADDRESS_MAILBOX ) {
30 esmtp_address_list_add( list, addr->ad_data.ad_mailbox->mb_addr_spec, 0, NULL ); 30 esmtp_address_list_add( list, addr->ad_data.ad_mailbox->mb_addr_spec, 0, NULL );
31 } else if ( addr->ad_type == MAILIMF_ADDRESS_GROUP ) { 31 } else if ( addr->ad_type == MAILIMF_ADDRESS_GROUP ) {
32 clist *l = addr->ad_data.ad_group->grp_mb_list->mb_list; 32 clist *l = addr->ad_data.ad_group->grp_mb_list->mb_list;
33 for ( it2 = clist_begin( l ); it2; it2 = it2->next ) { 33 for ( it2 = clist_begin( l ); it2; it2 = it2->next ) {
34 mailimf_mailbox *mbox; 34 mailimf_mailbox *mbox;
35 mbox = (mailimf_mailbox *) it2->data; 35 mbox = (mailimf_mailbox *) it2->data;
36 esmtp_address_list_add( list, mbox->mb_addr_spec, 0, NULL ); 36 esmtp_address_list_add( list, mbox->mb_addr_spec, 0, NULL );
37 } 37 }
38 } 38 }
39 } 39 }
40} 40}
41 41
42char *Generatemail::getFrom( mailimf_field *ffrom) { 42char *Generatemail::getFrom( mailimf_field *ffrom) {
43 char *from = NULL; 43 char *from = NULL;
44 if ( ffrom && (ffrom->fld_type == MAILIMF_FIELD_FROM) 44 if ( ffrom && (ffrom->fld_type == MAILIMF_FIELD_FROM)
45 && ffrom->fld_data.fld_from->frm_mb_list && ffrom->fld_data.fld_from->frm_mb_list->mb_list ) { 45 && ffrom->fld_data.fld_from->frm_mb_list && ffrom->fld_data.fld_from->frm_mb_list->mb_list ) {
46 clist *cl = ffrom->fld_data.fld_from->frm_mb_list->mb_list; 46 clist *cl = ffrom->fld_data.fld_from->frm_mb_list->mb_list;
47 clistiter *it; 47 clistiter *it;
48 for ( it = clist_begin( cl ); it; it = it->next ) { 48 for ( it = clist_begin( cl ); it; it = it->next ) {
49 mailimf_mailbox *mb = (mailimf_mailbox *) it->data; 49 mailimf_mailbox *mb = (mailimf_mailbox *) it->data;
50 from = strdup( mb->mb_addr_spec ); 50 from = strdup( mb->mb_addr_spec );
51 } 51 }
52 } 52 }
53 53
54 return from; 54 return from;
55} 55}
56 56
57char *Generatemail::getFrom( mailmime *mail ) { 57char *Generatemail::getFrom( mailmime *mail ) {
58 /* no need to delete - its just a pointer to structure content */ 58 /* no need to delete - its just a pointer to structure content */
59 mailimf_field *ffrom = 0; 59 mailimf_field *ffrom = 0;
60 ffrom = getField( mail->mm_data.mm_message.mm_fields, MAILIMF_FIELD_FROM ); 60 ffrom = getField( mail->mm_data.mm_message.mm_fields, MAILIMF_FIELD_FROM );
61 return getFrom(ffrom); 61 return getFrom(ffrom);
62} 62}
63 63
64mailimf_field *Generatemail::getField( mailimf_fields *fields, int type ) { 64mailimf_field *Generatemail::getField( mailimf_fields *fields, int type ) {
65 mailimf_field *field; 65 mailimf_field *field;
66 clistiter *it; 66 clistiter *it;
67 67
68 it = clist_begin( fields->fld_list ); 68 it = clist_begin( fields->fld_list );
69 while ( it ) { 69 while ( it ) {
70 field = (mailimf_field *) it->data; 70 field = (mailimf_field *) it->data;
71 if ( field->fld_type == type ) { 71 if ( field->fld_type == type ) {
72 return field; 72 return field;
73 } 73 }
74 it = it->next; 74 it = it->next;
75 } 75 }
76 76
77 return NULL; 77 return NULL;
78} 78}
79 79
80mailimf_address_list *Generatemail::parseAddresses(const QString&addr ) { 80mailimf_address_list *Generatemail::parseAddresses(const QString&addr ) {
81 mailimf_address_list *addresses; 81 mailimf_address_list *addresses;
82 82
83 if ( addr.isEmpty() ) 83 if ( addr.isEmpty() )
84 return NULL; 84 return NULL;
85 85
86 addresses = mailimf_address_list_new_empty(); 86 addresses = mailimf_address_list_new_empty();
87 87
88 bool literal_open = false; 88 bool literal_open = false;
89 unsigned int startpos = 0; 89 unsigned int startpos = 0;
90 QStringList list; 90 QStringList list;
91 QString s; 91 QString s;
92 unsigned int i = 0; 92 unsigned int i = 0;
93 for (; i < addr.length();++i) { 93 for (; i < addr.length();++i) {
94 switch (addr[i]) { 94 switch (addr[i]) {
95 case '\"': 95 case '\"':
96 literal_open = !literal_open; 96 literal_open = !literal_open;
97 break; 97 break;
98 case ',': 98 case ',':
99 if (!literal_open) { 99 if (!literal_open) {
100 s = addr.mid(startpos,i-startpos); 100 s = addr.mid(startpos,i-startpos);
101 if (!s.isEmpty()) { 101 if (!s.isEmpty()) {
102 list.append(s); 102 list.append(s);
103 } 103 }
104 // !!!! this is a MUST BE! 104 // !!!! this is a MUST BE!
105 startpos = ++i; 105 startpos = ++i;
106 } 106 }
107 break; 107 break;
108 default: 108 default:
109 break; 109 break;
110 } 110 }
111 } 111 }
112 s = addr.mid(startpos,i-startpos); 112 s = addr.mid(startpos,i-startpos);
113 if (!s.isEmpty()) { 113 if (!s.isEmpty()) {
114 list.append(s); 114 list.append(s);
115 } 115 }
116 QStringList::Iterator it; 116 QStringList::Iterator it;
117 for ( it = list.begin(); it != list.end(); it++ ) { 117 for ( it = list.begin(); it != list.end(); it++ ) {
118 int err = mailimf_address_list_add_parse( addresses, (char*)(*it).latin1() ); 118 int err = mailimf_address_list_add_parse( addresses, (char*)(*it).latin1() );
119 if ( err != MAILIMF_NO_ERROR ) { 119 if ( err != MAILIMF_NO_ERROR ) {
120 qDebug(" Error parsing"); // *it 120 qDebug(" Error parsing"); // *it
121 } else { 121 } else {
122 } 122 }
123 } 123 }
124 return addresses; 124 return addresses;
125} 125}
126 126
127mailmime *Generatemail::buildFilePart(const QString&filename,const QString&mimetype,const QString&TextContent ) { 127mailmime *Generatemail::buildFilePart(const QString&filename,const QString&mimetype,const QString&TextContent ) {
128 mailmime * filePart = 0; 128 mailmime * filePart = 0;
129 mailmime_fields * fields = 0; 129 mailmime_fields * fields = 0;
130 mailmime_content * content = 0; 130 mailmime_content * content = 0;
131 mailmime_parameter * param = 0; 131 mailmime_parameter * param = 0;
132 char*name = 0; 132 char*name = 0;
133 char*file = 0; 133 char*file = 0;
134 int err; 134 int err;
135
136 int pos = filename.findRev( '/' ); 135 int pos = filename.findRev( '/' );
137 136
138 if (filename.length()>0) { 137 if (filename.length()>0) {
139 QString tmp = filename.right( filename.length() - ( pos + 1 ) ); 138 QString tmp = filename.right( filename.length() - ( pos + 1 ) );
140 name = strdup( tmp.latin1() ); // just filename 139 name = strdup( tmp.latin1() ); // just filename
141 file = strdup( filename.latin1() ); // full name with path 140 file = strdup( filename.latin1() ); // full name with path
142 } 141 }
143 142
144 int disptype = MAILMIME_DISPOSITION_TYPE_ATTACHMENT; 143 int disptype = MAILMIME_DISPOSITION_TYPE_ATTACHMENT;
145 int mechanism = MAILMIME_MECHANISM_BASE64; 144 int mechanism = MAILMIME_MECHANISM_BASE64;
146 145
147 if ( mimetype.startsWith( "text/" ) ) { 146 if ( mimetype.startsWith( "text/" ) ) {
148 param = mailmime_parameter_new( strdup( "charset" ), 147 param = mailmime_parameter_new( strdup( "charset" ),
149 strdup( "iso-8859-1" ) ); 148 strdup( "iso-8859-1" ) );
150 mechanism = MAILMIME_MECHANISM_QUOTED_PRINTABLE; 149 mechanism = MAILMIME_MECHANISM_QUOTED_PRINTABLE;
151 } 150 }
152 151
153 fields = mailmime_fields_new_filename( 152 fields = mailmime_fields_new_filename(
154 disptype, name, 153 disptype, name,
155 mechanism ); 154 mechanism );
156 content = mailmime_content_new_with_str( (char*)mimetype.latin1() ); 155 content = mailmime_content_new_with_str( (char*)mimetype.latin1() );
157 if (content!=0 && fields != 0) { 156 if (content!=0 && fields != 0) {
158 if (param) { 157 if (param) {
159 clist_append(content->ct_parameters,param); 158 clist_append(content->ct_parameters,param);
160 param = 0; 159 param = 0;
161 } 160 }
162 if (filename.length()>0) { 161 if (filename.length()>0) {
163 QFileInfo f(filename); 162 QFileInfo f(filename);
164 param = mailmime_parameter_new(strdup("name"),strdup(f.fileName().latin1())); 163 param = mailmime_parameter_new(strdup("name"),strdup(f.fileName().latin1()));
165 clist_append(content->ct_parameters,param); 164 clist_append(content->ct_parameters,param);
166 param = 0; 165 param = 0;
167 } 166 }
168 filePart = mailmime_new_empty( content, fields ); 167 filePart = mailmime_new_empty( content, fields );
169 } 168 }
170 if (filePart) { 169 if (filePart) {
171 if (filename.length()>0) { 170 if (filename.length()>0) {
172 err = mailmime_set_body_file( filePart, file ); 171 err = mailmime_set_body_file( filePart, file );
173 } else { 172 } else {
174 err = mailmime_set_body_text(filePart,strdup(TextContent.data()),TextContent.length()); 173 err = mailmime_set_body_text(filePart,strdup( TextContent.utf8()),TextContent.utf8().length());
175 } 174 }
176 if (err != MAILIMF_NO_ERROR) { 175 if (err != MAILIMF_NO_ERROR) {
177 qDebug("Error setting body with file "); 176 qDebug("Error setting body with file ");
178 mailmime_free( filePart ); 177 mailmime_free( filePart );
179 filePart = 0; 178 filePart = 0;
180 } 179 }
181 } 180 }
182 181
183 if (!filePart) { 182 if (!filePart) {
184 if ( param != NULL ) { 183 if ( param != NULL ) {
185 mailmime_parameter_free( param ); 184 mailmime_parameter_free( param );
186 } 185 }
187 if (content) { 186 if (content) {
188 mailmime_content_free( content ); 187 mailmime_content_free( content );
189 } 188 }
190 if (fields) { 189 if (fields) {
191 mailmime_fields_free( fields ); 190 mailmime_fields_free( fields );
192 } else { 191 } else {
193 if (name) { 192 if (name) {
194 free( name ); 193 free( name );
195 } 194 }
196 if (file) { 195 if (file) {
197 free( file ); 196 free( file );
198 } 197 }
199 } 198 }
200 } 199 }
201 return filePart; // Success :) 200 return filePart; // Success :)
202 201
203} 202}
204 203
205void Generatemail::addFileParts( mailmime *message,const QList<Attachment>&files ) { 204void Generatemail::addFileParts( mailmime *message,const QList<Attachment>&files ) {
206 const Attachment *it; 205 const Attachment *it;
207 unsigned int count = files.count(); 206 unsigned int count = files.count();
208 for ( unsigned int i = 0; i < count; ++i ) { 207 for ( unsigned int i = 0; i < count; ++i ) {
209 mailmime *filePart; 208 mailmime *filePart;
210 int err; 209 int err;
211 it = ((QList<Attachment>)files).at(i); 210 it = ((QList<Attachment>)files).at(i);
212 211
213 filePart = buildFilePart( it->getFileName(), it->getMimeType(),"" ); 212 filePart = buildFilePart( it->getFileName(), it->getMimeType(),"" );
214 if ( filePart == NULL ) { 213 if ( filePart == NULL ) {
215 continue; 214 continue;
216 } 215 }
217 err = mailmime_smart_add_part( message, filePart ); 216 err = mailmime_smart_add_part( message, filePart );
218 if ( err != MAILIMF_NO_ERROR ) { 217 if ( err != MAILIMF_NO_ERROR ) {
219 mailmime_free( filePart ); 218 mailmime_free( filePart );
220 } 219 }
221 } 220 }
222} 221}
223 222
224mailmime *Generatemail::buildTxtPart(const QString&str ) { 223mailmime *Generatemail::buildTxtPart(const QString&str ) {
225 mailmime *txtPart; 224 mailmime *txtPart;
226 mailmime_fields *fields; 225 mailmime_fields *fields;
227 mailmime_content *content; 226 mailmime_content *content;
228 mailmime_parameter *param; 227 mailmime_parameter *param;
229 int err; 228 int err;
230 229 QCString __str;
231 param = mailmime_parameter_new( strdup( "charset" ), 230 param = mailmime_parameter_new( strdup( "charset" ),
232 strdup( "iso-8859-1" ) ); 231 strdup( "iso-8859-1" ) );
233 if ( param == NULL ) 232 if ( param == NULL )
234 goto err_free; 233 goto err_free;
235 234
236 content = mailmime_content_new_with_str( "text/plain" ); 235 content = mailmime_content_new_with_str( "text/plain" );
237 if ( content == NULL ) 236 if ( content == NULL )
238 goto err_free_param; 237 goto err_free_param;
239 238
240 err = clist_append( content->ct_parameters, param ); 239 err = clist_append( content->ct_parameters, param );
241 if ( err != MAILIMF_NO_ERROR ) 240 if ( err != MAILIMF_NO_ERROR )
242 goto err_free_content; 241 goto err_free_content;
243 242
244 fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT); 243 fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT);
245 if ( fields == NULL ) 244 if ( fields == NULL )
246 goto err_free_content; 245 goto err_free_content;
247 246
248 txtPart = mailmime_new_empty( content, fields ); 247 txtPart = mailmime_new_empty( content, fields );
249 if ( txtPart == NULL ) 248 if ( txtPart == NULL )
250 goto err_free_fields; 249 goto err_free_fields;
251 250 {
252 err = mailmime_set_body_text( txtPart, (char*)str.data(), str.length() ); 251 __str = str.utf8();
252 err = mailmime_set_body_text( txtPart, __str.data(), __str.length() );
253 }
253 if ( err != MAILIMF_NO_ERROR ) 254 if ( err != MAILIMF_NO_ERROR )
254 goto err_free_txtPart; 255 goto err_free_txtPart;
255 256
256 return txtPart; // Success :) 257 return txtPart; // Success :)
257 258
258err_free_txtPart: 259err_free_txtPart:
259 mailmime_free( txtPart ); 260 mailmime_free( txtPart );
260err_free_fields: 261err_free_fields:
261 mailmime_fields_free( fields ); 262 mailmime_fields_free( fields );
262err_free_content: 263err_free_content:
263 mailmime_content_free( content ); 264 mailmime_content_free( content );
264err_free_param: 265err_free_param:
265 mailmime_parameter_free( param ); 266 mailmime_parameter_free( param );
266err_free: 267err_free:
267 ; 268 ;
268 269
269 return NULL; // Error :( 270 return NULL; // Error :(
270} 271}
271 272
272mailimf_mailbox *Generatemail::newMailbox(const QString&name, const QString&mail ) { 273mailimf_mailbox *Generatemail::newMailbox(const QString&name, const QString&mail ) {
273 return mailimf_mailbox_new( strdup( name.latin1() ), 274 return mailimf_mailbox_new( strdup( name.latin1() ),
274 strdup( mail.latin1() ) ); 275 strdup( mail.latin1() ) );
275} 276}
276 277
277mailimf_fields *Generatemail::createImfFields(const Opie::Core::OSmartPointer<Mail>&mail ) 278mailimf_fields *Generatemail::createImfFields(const Opie::Core::OSmartPointer<Mail>&mail )
278{ 279{
279 mailimf_fields *fields = NULL; 280 mailimf_fields *fields = NULL;
280 mailimf_field *xmailer = NULL; 281 mailimf_field *xmailer = NULL;
281 mailimf_mailbox *sender=0,*fromBox=0; 282 mailimf_mailbox *sender=0,*fromBox=0;
282 mailimf_mailbox_list *from=0; 283 mailimf_mailbox_list *from=0;
283 mailimf_address_list *to=0, *cc=0, *bcc=0, *reply=0; 284 mailimf_address_list *to=0, *cc=0, *bcc=0, *reply=0;
284 clist*in_reply_to = 0; 285 clist*in_reply_to = 0;
285 char *subject = strdup( mail->getSubject().latin1() ); 286 char *subject = strdup( mail->getSubject().latin1() );
286 int err; 287 int err;
287 int res = 1; 288 int res = 1;
288 289
289 sender = newMailbox( mail->getName(), mail->getMail() ); 290 sender = newMailbox( mail->getName(), mail->getMail() );
290 if ( sender == NULL ) { 291 if ( sender == NULL ) {
291 res = 0; 292 res = 0;
292 } 293 }
293 294
294 if (res) { 295 if (res) {
295 fromBox = newMailbox( mail->getName(), mail->getMail() ); 296 fromBox = newMailbox( mail->getName(), mail->getMail() );
296 } 297 }
297 if ( fromBox == NULL ) { 298 if ( fromBox == NULL ) {
298 res = 0; 299 res = 0;
299 } 300 }
300 301
301 if (res) { 302 if (res) {
302 from = mailimf_mailbox_list_new_empty(); 303 from = mailimf_mailbox_list_new_empty();
303 } 304 }
304 if ( from == NULL ) { 305 if ( from == NULL ) {
305 res = 0; 306 res = 0;
306 } 307 }
307 308
308 if (res && from) { 309 if (res && from) {
309 err = mailimf_mailbox_list_add( from, fromBox ); 310 err = mailimf_mailbox_list_add( from, fromBox );
310 if ( err != MAILIMF_NO_ERROR ) { 311 if ( err != MAILIMF_NO_ERROR ) {
311 res = 0; 312 res = 0;
312 } 313 }
313 } 314 }
314 315
315 if (res) to = parseAddresses( mail->getTo() ); 316 if (res) to = parseAddresses( mail->getTo() );
316 if (res) cc = parseAddresses( mail->getCC() ); 317 if (res) cc = parseAddresses( mail->getCC() );
317 if (res) bcc = parseAddresses( mail->getBCC() ); 318 if (res) bcc = parseAddresses( mail->getBCC() );
318 if (res) reply = parseAddresses( mail->getReply() ); 319 if (res) reply = parseAddresses( mail->getReply() );
319 320
320 if (res && mail->Inreply().count()>0) { 321 if (res && mail->Inreply().count()>0) {
321 in_reply_to = clist_new(); 322 in_reply_to = clist_new();
322 char*c_reply; 323 char*c_reply;
323 unsigned int nsize = 0; 324 unsigned int nsize = 0;
324 for (QStringList::ConstIterator it=mail->Inreply().begin(); 325 for (QStringList::ConstIterator it=mail->Inreply().begin();
325 it != mail->Inreply().end();++it) { 326 it != mail->Inreply().end();++it) {
326 if ((*it).isEmpty()) 327 if ((*it).isEmpty())
327 continue; 328 continue;
328 QString h((*it)); 329 QString h((*it));
329 while (h.length()>0 && h[0]=='<') { 330 while (h.length()>0 && h[0]=='<') {
330 h.remove(0,1); 331 h.remove(0,1);
331 } 332 }
332 while (h.length()>0 && h[h.length()-1]=='>') { 333 while (h.length()>0 && h[h.length()-1]=='>') {
333 h.remove(h.length()-1,1); 334 h.remove(h.length()-1,1);
334 } 335 }
335 if (h.isEmpty()) continue; 336 if (h.isEmpty()) continue;
336 nsize = strlen(h.latin1()); 337 nsize = strlen(h.latin1());
337 /* yes! must be malloc! */ 338 /* yes! must be malloc! */
338 c_reply = (char*)malloc( (nsize+1)*sizeof(char)); 339 c_reply = (char*)malloc( (nsize+1)*sizeof(char));
339 memset(c_reply,0,nsize+1); 340 memset(c_reply,0,nsize+1);
340 memcpy(c_reply,h.latin1(),nsize); 341 memcpy(c_reply,h.latin1(),nsize);
341 clist_append(in_reply_to,c_reply); 342 clist_append(in_reply_to,c_reply);
342 } 343 }
343 } 344 }
344 345
345 if (res) { 346 if (res) {
346 fields = mailimf_fields_new_with_data( from, sender, reply, to, cc, bcc, 347 fields = mailimf_fields_new_with_data( from, sender, reply, to, cc, bcc,
347 in_reply_to, NULL, subject ); 348 in_reply_to, NULL, subject );
348 if ( fields == NULL ) { 349 if ( fields == NULL ) {
349 res = 0; 350 res = 0;
350 } 351 }
351 } 352 }
352 if (res) xmailer = mailimf_field_new_custom( strdup( "User-Agent" ), 353 if (res) xmailer = mailimf_field_new_custom( strdup( "User-Agent" ),
353 strdup( USER_AGENT ) ); 354 strdup( USER_AGENT ) );
354 if ( xmailer == NULL ) { 355 if ( xmailer == NULL ) {
355 res = 0; 356 res = 0;
356 } else { 357 } else {
357 err = mailimf_fields_add( fields, xmailer ); 358 err = mailimf_fields_add( fields, xmailer );
358 if ( err != MAILIMF_NO_ERROR ) { 359 if ( err != MAILIMF_NO_ERROR ) {
359 res = 0; 360 res = 0;
360 } 361 }
361 } 362 }
362 if (!res ) { 363 if (!res ) {
363 if (xmailer) { 364 if (xmailer) {
364 mailimf_field_free( xmailer ); 365 mailimf_field_free( xmailer );
365 xmailer = NULL; 366 xmailer = NULL;
366 } 367 }
367 if (fields) { 368 if (fields) {
368 mailimf_fields_free( fields ); 369 mailimf_fields_free( fields );
369 fields = NULL; 370 fields = NULL;
370 } else { 371 } else {
371 if (reply) 372 if (reply)
372 mailimf_address_list_free( reply ); 373 mailimf_address_list_free( reply );
373 if (bcc) 374 if (bcc)
374 mailimf_address_list_free( bcc ); 375 mailimf_address_list_free( bcc );
375 if (cc) 376 if (cc)
376 mailimf_address_list_free( cc ); 377 mailimf_address_list_free( cc );
377 if (to) 378 if (to)
378 mailimf_address_list_free( to ); 379 mailimf_address_list_free( to );
379 if (fromBox) { 380 if (fromBox) {
380 mailimf_mailbox_free( fromBox ); 381 mailimf_mailbox_free( fromBox );
381 } else if (from) { 382 } else if (from) {
382 mailimf_mailbox_list_free( from ); 383 mailimf_mailbox_list_free( from );
383 } 384 }
384 if (sender) { 385 if (sender) {
385 mailimf_mailbox_free( sender ); 386 mailimf_mailbox_free( sender );
386 } 387 }
387 if (subject) { 388 if (subject) {
388 free( subject ); 389 free( subject );
389 } 390 }
390 } 391 }
391 } 392 }
392 return fields; 393 return fields;
393} 394}
394 395
395mailmime *Generatemail::createMimeMail(const Opie::Core::OSmartPointer<Mail> &mail ) { 396mailmime *Generatemail::createMimeMail(const Opie::Core::OSmartPointer<Mail> &mail ) {
396 mailmime *message, *txtPart; 397 mailmime *message, *txtPart;
397 mailimf_fields *fields; 398 mailimf_fields *fields;
398 int err; 399 int err;
399 400
400 fields = createImfFields( mail ); 401 fields = createImfFields( mail );
401 if ( fields == NULL ) 402 if ( fields == NULL )
402 goto err_free; 403 goto err_free;
403 404
404 message = mailmime_new_message_data( NULL ); 405 message = mailmime_new_message_data( NULL );
405 if ( message == NULL ) 406 if ( message == NULL )
406 goto err_free_fields; 407 goto err_free_fields;
407 408
408 mailmime_set_imf_fields( message, fields ); 409 mailmime_set_imf_fields( message, fields );
409 410
410 txtPart = buildTxtPart( mail->getMessage() ); 411 txtPart = buildTxtPart( mail->getMessage() );
411 412
412 if ( txtPart == NULL ) 413 if ( txtPart == NULL )
413 goto err_free_message; 414 goto err_free_message;
414 415
415 err = mailmime_smart_add_part( message, txtPart ); 416 err = mailmime_smart_add_part( message, txtPart );
416 if ( err != MAILIMF_NO_ERROR ) 417 if ( err != MAILIMF_NO_ERROR )
417 goto err_free_txtPart; 418 goto err_free_txtPart;
418 419
419 addFileParts( message, mail->getAttachments() ); 420 addFileParts( message, mail->getAttachments() );
420 421
421 return message; // Success :) 422 return message; // Success :)
422 423
423err_free_txtPart: 424err_free_txtPart:
424 mailmime_free( txtPart ); 425 mailmime_free( txtPart );
425err_free_message: 426err_free_message:
426 mailmime_free( message ); 427 mailmime_free( message );
427err_free_fields: 428err_free_fields:
428 mailimf_fields_free( fields ); 429 mailimf_fields_free( fields );
429err_free: 430err_free:
430 ; 431 ;
431 432
432 return NULL; // Error :( 433 return NULL; // Error :(
433} 434}
434 435
435clist *Generatemail::createRcptList( mailimf_fields *fields ) { 436clist *Generatemail::createRcptList( mailimf_fields *fields ) {
436 clist *rcptList; 437 clist *rcptList;
437 mailimf_field *field; 438 mailimf_field *field;
438 439
439 rcptList = esmtp_address_list_new(); 440 rcptList = esmtp_address_list_new();
440 441
441 field = getField( fields, MAILIMF_FIELD_TO ); 442 field = getField( fields, MAILIMF_FIELD_TO );
442 if ( field && (field->fld_type == MAILIMF_FIELD_TO) 443 if ( field && (field->fld_type == MAILIMF_FIELD_TO)
443 && field->fld_data.fld_to->to_addr_list ) { 444 && field->fld_data.fld_to->to_addr_list ) {
444 addRcpts( rcptList, field->fld_data.fld_to->to_addr_list ); 445 addRcpts( rcptList, field->fld_data.fld_to->to_addr_list );
445 } 446 }
446 447
447 field = getField( fields, MAILIMF_FIELD_CC ); 448 field = getField( fields, MAILIMF_FIELD_CC );
448 if ( field && (field->fld_type == MAILIMF_FIELD_CC) 449 if ( field && (field->fld_type == MAILIMF_FIELD_CC)
449 && field->fld_data.fld_cc->cc_addr_list ) { 450 && field->fld_data.fld_cc->cc_addr_list ) {
450 addRcpts( rcptList, field->fld_data.fld_cc->cc_addr_list ); 451 addRcpts( rcptList, field->fld_data.fld_cc->cc_addr_list );
451 } 452 }
452 453
453 field = getField( fields, MAILIMF_FIELD_BCC ); 454 field = getField( fields, MAILIMF_FIELD_BCC );
454 if ( field && (field->fld_type == MAILIMF_FIELD_BCC) 455 if ( field && (field->fld_type == MAILIMF_FIELD_BCC)
455 && field->fld_data.fld_bcc->bcc_addr_list ) { 456 && field->fld_data.fld_bcc->bcc_addr_list ) {
456 addRcpts( rcptList, field->fld_data.fld_bcc->bcc_addr_list ); 457 addRcpts( rcptList, field->fld_data.fld_bcc->bcc_addr_list );
457 } 458 }
458 459
459 return rcptList; 460 return rcptList;
460} 461}
diff --git a/kmicromail/libmailwrapper/imapwrapper.cpp b/kmicromail/libmailwrapper/imapwrapper.cpp
index ae667ec..d90a8d2 100644
--- a/kmicromail/libmailwrapper/imapwrapper.cpp
+++ b/kmicromail/libmailwrapper/imapwrapper.cpp
@@ -1,883 +1,884 @@
1// CHANGED 2004-09-31 Lutz Rogowski 1// CHANGED 2004-09-31 Lutz Rogowski
2#include <stdlib.h> 2#include <stdlib.h>
3#include <libetpan/libetpan.h> 3#include <libetpan/libetpan.h>
4#include <qpe/global.h> 4#include <qpe/global.h>
5#include <qapplication.h> 5#include <qapplication.h>
6#include "imapwrapper.h" 6#include "imapwrapper.h"
7#include "mailtypes.h" 7#include "mailtypes.h"
8#include "logindialog.h" 8#include "logindialog.h"
9#include <qprogressbar.h> 9#include <qprogressbar.h>
10#include "genericwrapper.h" 10#include "genericwrapper.h"
11#include <kglobal.h> 11#include <kglobal.h>
12 12
13using namespace Opie::Core; 13using namespace Opie::Core;
14int IMAPwrapper::mMax = 0; 14int IMAPwrapper::mMax = 0;
15int IMAPwrapper::mCurrent = 0; 15int IMAPwrapper::mCurrent = 0;
16 16
17IMAPwrapper::IMAPwrapper( IMAPaccount *a ) 17IMAPwrapper::IMAPwrapper( IMAPaccount *a )
18 : AbstractMail() 18 : AbstractMail()
19{ 19{
20 account = a; 20 account = a;
21 m_imap = 0; 21 m_imap = 0;
22 m_Lastmbox = ""; 22 m_Lastmbox = "";
23 mCurrent = 0; 23 mCurrent = 0;
24 mMax = 0; 24 mMax = 0;
25} 25}
26 26
27IMAPwrapper::~IMAPwrapper() 27IMAPwrapper::~IMAPwrapper()
28{ 28{
29 logout(); 29 logout();
30} 30}
31 31
32/* to avoid to often select statements in loops etc. 32/* to avoid to often select statements in loops etc.
33 we trust that we are logged in and connection is established!*/ 33 we trust that we are logged in and connection is established!*/
34int IMAPwrapper::selectMbox(const QString&mbox) 34int IMAPwrapper::selectMbox(const QString&mbox)
35{ 35{
36 if (mbox == m_Lastmbox) { 36 if (mbox == m_Lastmbox) {
37 return MAILIMAP_NO_ERROR; 37 return MAILIMAP_NO_ERROR;
38 } 38 }
39 int err = mailimap_select( m_imap, (char*)mbox.latin1()); 39 int err = mailimap_select( m_imap, (char*)mbox.latin1());
40 if ( err != MAILIMAP_NO_ERROR ) { 40 if ( err != MAILIMAP_NO_ERROR ) {
41 m_Lastmbox = ""; 41 m_Lastmbox = "";
42 return err; 42 return err;
43 } 43 }
44 m_Lastmbox = mbox; 44 m_Lastmbox = mbox;
45 return err; 45 return err;
46} 46}
47 47
48void IMAPwrapper::imap_progress( size_t current, size_t maximum ) 48void IMAPwrapper::imap_progress( size_t current, size_t maximum )
49{ 49{
50 //qDebug("imap progress %d of %d ",current,maximum ); 50 //qDebug("imap progress %d of %d ",current,maximum );
51 //Global::statusMessage(i18n("Downloading message %1 of %2").arg( current).arg(maximum)); 51 //Global::statusMessage(i18n("Downloading message %1 of %2").arg( current).arg(maximum));
52 //qApp->processEvents() 52 //qApp->processEvents()
53 static int last = 0; 53 static int last = 0;
54 if ( last != current ) 54 if ( last != current )
55 IMAPwrapper::progress(); 55 IMAPwrapper::progress();
56 last = current; 56 last = current;
57} 57}
58void IMAPwrapper::progress( QString m ) 58void IMAPwrapper::progress( QString m )
59{ 59{
60 60
61 static QString mProgrMess; 61 static QString mProgrMess;
62 if ( m != QString::null ) { 62 if ( m != QString::null ) {
63 mProgrMess = m; 63 mProgrMess = m;
64 mCurrent = 1; 64 mCurrent = 1;
65 return; 65 return;
66 } 66 }
67 QString mess; 67 QString mess;
68 //qDebug("progress "); 68 //qDebug("progress ");
69 if ( mMax ) mess = mProgrMess +i18n(" message %1 of %2").arg( mCurrent++).arg(mMax); 69 if ( mMax ) mess = mProgrMess +i18n(" message %1 of %2").arg( mCurrent++).arg(mMax);
70 else mess = mProgrMess +i18n(" message %1").arg( mCurrent++); 70 else mess = mProgrMess +i18n(" message %1").arg( mCurrent++);
71 Global::statusMessage(mess); 71 Global::statusMessage(mess);
72 //qDebug("Progress %s %s", mess.latin1(), m.latin1()); 72 //qDebug("Progress %s %s", mess.latin1(), m.latin1());
73 qApp->processEvents(); 73 qApp->processEvents();
74} 74}
75bool IMAPwrapper::start_tls(bool force_tls) 75bool IMAPwrapper::start_tls(bool force_tls)
76{ 76{
77 int err; 77 int err;
78 bool try_tls; 78 bool try_tls = force_tls;
79 mailimap_capability_data * cap_data = 0; 79 mailimap_capability_data * cap_data = 0;
80 80
81 err = mailimap_capability(m_imap,&cap_data); 81 err = mailimap_capability(m_imap,&cap_data);
82 if (err != MAILIMAP_NO_ERROR) { 82 if (err != MAILIMAP_NO_ERROR) {
83 Global::statusMessage("error getting capabilities!"); 83 Global::statusMessage("error getting capabilities!");
84 return false; 84 return false;
85 } 85 }
86 clistiter * cur; 86 clistiter * cur;
87 for(cur = clist_begin(cap_data->cap_list) ; cur != NULL;cur = clist_next(cur)) { 87 for(cur = clist_begin(cap_data->cap_list) ; cur != NULL;cur = clist_next(cur)) {
88 struct mailimap_capability * cap; 88 struct mailimap_capability * cap;
89 cap = (struct mailimap_capability *)clist_content(cur); 89 cap = (struct mailimap_capability *)clist_content(cur);
90 if (cap->cap_type == MAILIMAP_CAPABILITY_NAME) { 90 if (cap->cap_type == MAILIMAP_CAPABILITY_NAME) {
91 if (strcasecmp(cap->cap_data.cap_name, "STARTTLS") == 0) { 91 if (strcasecmp(cap->cap_data.cap_name, "STARTTLS") == 0) {
92 try_tls = true; 92 try_tls = true;
93 break; 93 break;
94 } 94 }
95 } 95 }
96 } 96 }
97 if (cap_data) { 97 if (cap_data) {
98 mailimap_capability_data_free(cap_data); 98 mailimap_capability_data_free(cap_data);
99 } 99 }
100 if (try_tls) { 100 if (try_tls) {
101 err = mailimap_starttls(m_imap); 101 err = mailimap_starttls(m_imap);
102 if (err != MAILIMAP_NO_ERROR && force_tls) { 102 if (err != MAILIMAP_NO_ERROR && force_tls) {
103 Global::statusMessage(i18n("Server has no TLS support!")); 103 Global::statusMessage(i18n("Server has no TLS support!"));
104 try_tls = false; 104 try_tls = false;
105 } else { 105 } else {
106 mailstream_low * low; 106 mailstream_low * low;
107 mailstream_low * new_low; 107 mailstream_low * new_low;
108 low = mailstream_get_low(m_imap->imap_stream); 108 low = mailstream_get_low(m_imap->imap_stream);
109 if (!low) { 109 if (!low) {
110 try_tls = false; 110 try_tls = false;
111 } else { 111 } else {
112 int fd = mailstream_low_get_fd(low); 112 int fd = mailstream_low_get_fd(low);
113 if (fd > -1 && (new_low = mailstream_low_ssl_open(fd))!=0) { 113 if (fd > -1 && (new_low = mailstream_low_ssl_open(fd))!=0) {
114 mailstream_low_free(low); 114 mailstream_low_free(low);
115 mailstream_set_low(m_imap->imap_stream, new_low); 115 mailstream_set_low(m_imap->imap_stream, new_low);
116 } else { 116 } else {
117 try_tls = false; 117 try_tls = false;
118 } 118 }
119 } 119 }
120 } 120 }
121 } 121 }
122 return try_tls; 122 return try_tls;
123} 123}
124 124
125void IMAPwrapper::login() 125void IMAPwrapper::login()
126{ 126{
127 QString server, user, pass; 127 QString server, user, pass;
128 uint16_t port; 128 uint16_t port;
129 int err = MAILIMAP_NO_ERROR; 129 int err = MAILIMAP_NO_ERROR;
130 130
131 if (account->getOffline()) return; 131 if (account->getOffline()) return;
132 /* we are connected this moment */ 132 /* we are connected this moment */
133 /* TODO: setup a timer holding the line or if connection closed - delete the value */ 133 /* TODO: setup a timer holding the line or if connection closed - delete the value */
134 if (m_imap) { 134 if (m_imap) {
135 err = mailimap_noop(m_imap); 135 err = mailimap_noop(m_imap);
136 if (err!=MAILIMAP_NO_ERROR) { 136 if (err!=MAILIMAP_NO_ERROR) {
137 logout(); 137 logout();
138 } else { 138 } else {
139 mailstream_flush(m_imap->imap_stream); 139 mailstream_flush(m_imap->imap_stream);
140 return; 140 return;
141 } 141 }
142 } 142 }
143 server = account->getServer(); 143 server = account->getServer();
144 port = account->getPort().toUInt(); 144 port = account->getPort().toUInt();
145 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 145 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
146 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 146 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
147 login.show(); 147 login.show();
148 if ( QDialog::Accepted == login.exec() ) { 148 if ( QDialog::Accepted == login.exec() ) {
149 // ok 149 // ok
150 user = login.getUser(); 150 user = login.getUser();
151 pass = login.getPassword(); 151 pass = login.getPassword();
152 } else { 152 } else {
153 // cancel 153 // cancel
154 return; 154 return;
155 } 155 }
156 } else { 156 } else {
157 user = account->getUser(); 157 user = account->getUser();
158 pass = account->getPassword(); 158 pass = account->getPassword();
159 } 159 }
160 160
161 m_imap = mailimap_new( 20, &imap_progress ); 161 m_imap = mailimap_new( 20, &imap_progress );
162 162
163 /* connect */ 163 /* connect */
164 bool ssl = false; 164 bool ssl = false;
165 bool try_tls = false; 165 bool try_tls = false;
166 bool force_tls = false; 166 bool force_tls = false;
167 167
168 if ( account->ConnectionType() == 2 ) { 168 if ( account->ConnectionType() == 2 ) {
169 ssl = true; 169 ssl = true;
170 } 170 }
171 if (account->ConnectionType()==1) { 171 if (account->ConnectionType()==1) {
172 force_tls = true; 172 force_tls = true;
173 } 173 }
174 174
175 if ( ssl ) { 175 if ( ssl ) {
176 qDebug("using ssl "); 176 qDebug("using ssl ");
177 err = mailimap_ssl_connect( m_imap, (char*)server.latin1(), port ); 177 err = mailimap_ssl_connect( m_imap, (char*)server.latin1(), port );
178 qDebug("back "); 178 qDebug("back ");
179 } else { 179 } else {
180 err = mailimap_socket_connect( m_imap, (char*)server.latin1(), port ); 180 err = mailimap_socket_connect( m_imap, (char*)server.latin1(), port );
181 } 181 }
182 182
183 if ( err != MAILIMAP_NO_ERROR && 183 if ( err != MAILIMAP_NO_ERROR &&
184 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 184 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
185 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 185 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
186 QString failure = ""; 186 QString failure = "";
187 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) { 187 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) {
188 failure="Connection refused"; 188 failure="Connection refused";
189 } else { 189 } else {
190 failure="Unknown failure"; 190 failure="Unknown failure";
191 } 191 }
192 Global::statusMessage(i18n("error connecting imap server: %1").arg(failure)); 192 Global::statusMessage(i18n("error connecting imap server: %1").arg(failure));
193 mailimap_free( m_imap ); 193 mailimap_free( m_imap );
194 m_imap = 0; 194 m_imap = 0;
195 return; 195 return;
196 } 196 }
197 197
198 if (!ssl) { 198 if (!ssl) {
199 try_tls = start_tls(force_tls); 199 try_tls = start_tls(force_tls);
200 } 200 }
201 201
202 bool ok = true; 202 bool ok = true;
203 if (force_tls && !try_tls) { 203 if (force_tls && !try_tls) {
204 Global::statusMessage(i18n("Server has no TLS support!")); 204 Global::statusMessage(i18n("Server has no TLS support!"));
205 ok = false; 205 ok = false;
206 } 206 }
207 207
208 208
209 /* login */ 209 /* login */
210 210
211 if (ok) { 211 if (ok) {
212 err = mailimap_login_simple( m_imap, (char*)user.latin1(), (char*)pass.latin1() ); 212 err = mailimap_login_simple( m_imap, (char*)user.latin1(), (char*)pass.latin1() );
213 if ( err != MAILIMAP_NO_ERROR ) { 213 if ( err != MAILIMAP_NO_ERROR ) {
214 Global::statusMessage(i18n("error logging in imap server: %1").arg(m_imap->imap_response)); 214 Global::statusMessage(i18n("error logging in imap server: %1").arg(m_imap->imap_response));
215 ok = false; 215 ok = false;
216 } 216 }
217 } 217 }
218 if (!ok) { 218 if (!ok) {
219 err = mailimap_close( m_imap ); 219 err = mailimap_close( m_imap );
220 mailimap_free( m_imap ); 220 mailimap_free( m_imap );
221 m_imap = 0; 221 m_imap = 0;
222 } 222 }
223} 223}
224 224
225void IMAPwrapper::logout() 225void IMAPwrapper::logout()
226{ 226{
227 int err = MAILIMAP_NO_ERROR; 227 int err = MAILIMAP_NO_ERROR;
228 if (!m_imap) return; 228 if (!m_imap) return;
229 err = mailimap_logout( m_imap ); 229 err = mailimap_logout( m_imap );
230 err = mailimap_close( m_imap ); 230 err = mailimap_close( m_imap );
231 mailimap_free( m_imap ); 231 mailimap_free( m_imap );
232 m_imap = 0; 232 m_imap = 0;
233 m_Lastmbox = ""; 233 m_Lastmbox = "";
234} 234}
235 235
236void IMAPwrapper::listMessages(const QString&mailbox,QValueList<Opie::Core::OSmartPointer<RecMail> > &target , int maxSizeInKb) 236void IMAPwrapper::listMessages(const QString&mailbox,QValueList<Opie::Core::OSmartPointer<RecMail> > &target , int maxSizeInKb)
237{ 237{
238 238
239 int tryAgain = 1; 239 int tryAgain = 1;
240 while ( tryAgain >= 0 ) { 240 while ( tryAgain >= 0 ) {
241 int err = MAILIMAP_NO_ERROR; 241 int err = MAILIMAP_NO_ERROR;
242 clist *result = 0; 242 clist *result = 0;
243 clistcell *current; 243 clistcell *current;
244 mailimap_fetch_type *fetchType = 0; 244 mailimap_fetch_type *fetchType = 0;
245 mailimap_set *set = 0; 245 mailimap_set *set = 0;
246 246
247 login(); 247 login();
248 if (!m_imap) { 248 if (!m_imap) {
249 return; 249 return;
250 } 250 }
251 /* select mailbox READONLY for operations */ 251 /* select mailbox READONLY for operations */
252 err = selectMbox(mailbox); 252 err = selectMbox(mailbox);
253 if ( err != MAILIMAP_NO_ERROR ) { 253 if ( err != MAILIMAP_NO_ERROR ) {
254 return; 254 return;
255 } 255 }
256 256
257 int last = m_imap->imap_selection_info->sel_exists; 257 int last = m_imap->imap_selection_info->sel_exists;
258 258
259 if (last == 0) { 259 if (last == 0) {
260 Global::statusMessage(i18n("Mailbox has no mails")); 260 Global::statusMessage(i18n("Mailbox has no mails"));
261 return; 261 return;
262 } else { 262 } else {
263 } 263 }
264 progress( i18n("Fetch ")); 264 progress( i18n("Fetch "));
265 mMax = last; 265 mMax = last;
266 //qDebug("last %d ", last); 266 //qDebug("last %d ", last);
267 Global::statusMessage(i18n("Fetching header list")); 267 Global::statusMessage(i18n("Fetching header list"));
268 qApp->processEvents(); 268 qApp->processEvents();
269 /* the range has to start at 1!!! not with 0!!!! */ 269 /* the range has to start at 1!!! not with 0!!!! */
270 //LR the access to web.de imap server is no working with value 1 270 //LR the access to web.de imap server is no working with value 1
271 //qDebug("interval %d - %d ", tryAgain, last-1+tryAgain ); 271 //qDebug("interval %d - %d ", tryAgain, last-1+tryAgain );
272 set = mailimap_set_new_interval( tryAgain, last ); 272 set = mailimap_set_new_interval( tryAgain, last );
273 fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); 273 fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
274 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); 274 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope());
275 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); 275 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags());
276 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); 276 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate());
277 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); 277 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size());
278 278
279 err = mailimap_fetch( m_imap, set, fetchType, &result ); 279 err = mailimap_fetch( m_imap, set, fetchType, &result );
280 mailimap_set_free( set ); 280 mailimap_set_free( set );
281 mailimap_fetch_type_free( fetchType ); 281 mailimap_fetch_type_free( fetchType );
282 282
283 QString date,subject,from; 283 QString date,subject,from;
284 284
285 if ( err == MAILIMAP_NO_ERROR ) { 285 if ( err == MAILIMAP_NO_ERROR ) {
286 tryAgain = -1; 286 tryAgain = -1;
287 mailimap_msg_att * msg_att; 287 mailimap_msg_att * msg_att;
288 int i = 0; 288 int i = 0;
289 for (current = clist_begin(result); current != 0; current=clist_next(current)) { 289 for (current = clist_begin(result); current != 0; current=clist_next(current)) {
290 ++i; 290 ++i;
291 //qDebug("iii %d ",i); 291 //qDebug("iii %d ",i);
292 msg_att = (mailimap_msg_att*)current->data; 292 msg_att = (mailimap_msg_att*)current->data;
293 RecMail*m = parse_list_result(msg_att); 293 RecMail*m = parse_list_result(msg_att);
294 if (m) { 294 if (m) {
295 if ( maxSizeInKb == 0 || m->Msgsize()<=maxSizeInKb*1024 ) { 295 if ( maxSizeInKb == 0 || m->Msgsize()<=maxSizeInKb*1024 ) {
296 m->setNumber(i); 296 m->setNumber(i);
297 m->setMbox(mailbox); 297 m->setMbox(mailbox);
298 m->setWrapper(this); 298 m->setWrapper(this);
299 target.append(m); 299 target.append(m);
300 } 300 }
301 } 301 }
302 } 302 }
303 Global::statusMessage(i18n("Mailbox has %1 mails").arg(target.count())); 303 Global::statusMessage(i18n("Mailbox has %1 mails").arg(target.count()));
304 } else { 304 } else {
305 --tryAgain; 305 --tryAgain;
306 --tryAgain;//disabled tryagain by adding this line 306 --tryAgain;//disabled tryagain by adding this line
307 if ( tryAgain < 0 ) 307 if ( tryAgain < 0 )
308 Global::statusMessage(i18n("Error fetching headers: %1").arg(m_imap->imap_response)); 308 Global::statusMessage(i18n("Error fetching headers: %1").arg(m_imap->imap_response));
309 else 309 else
310 qDebug("try again... "); 310 qDebug("try again... ");
311 } 311 }
312 312
313 if (result) mailimap_fetch_list_free(result); 313 if (result) mailimap_fetch_list_free(result);
314 } 314 }
315} 315}
316 316
317QValueList<Opie::Core::OSmartPointer<Folder> >* IMAPwrapper::listFolders() 317QValueList<Opie::Core::OSmartPointer<Folder> >* IMAPwrapper::listFolders()
318{ 318{
319 const char *path, *mask; 319 const char *path, *mask;
320 int err = MAILIMAP_NO_ERROR; 320 int err = MAILIMAP_NO_ERROR;
321 clist *result = 0; 321 clist *result = 0;
322 clistcell *current = 0; 322 clistcell *current = 0;
323 clistcell*cur_flag = 0; 323 clistcell*cur_flag = 0;
324 mailimap_mbx_list_flags*bflags = 0; 324 mailimap_mbx_list_flags*bflags = 0;
325 325
326 QValueList<FolderP>* folders = new QValueList<FolderP>(); 326 QValueList<FolderP>* folders = new QValueList<FolderP>();
327 login(); 327 login();
328 if (!m_imap) { 328 if (!m_imap) {
329 return folders; 329 return folders;
330 } 330 }
331 331
332/* 332/*
333 * First we have to check for INBOX 'cause it sometimes it's not inside the path. 333 * First we have to check for INBOX 'cause it sometimes it's not inside the path.
334 * We must not forget to filter them out in next loop! 334 * We must not forget to filter them out in next loop!
335 * it seems like ugly code. and yes - it is ugly code. but the best way. 335 * it seems like ugly code. and yes - it is ugly code. but the best way.
336 */ 336 */
337 Global::statusMessage(i18n("Fetching folder list")); 337 Global::statusMessage(i18n("Fetching folder list"));
338 qApp->processEvents(); 338 qApp->processEvents();
339 QString temp; 339 QString temp;
340 mask = "INBOX" ; 340 mask = "INBOX" ;
341 mailimap_mailbox_list *list; 341 mailimap_mailbox_list *list;
342 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); 342 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
343 QString del; 343 QString del;
344 bool selectable = true; 344 bool selectable = true;
345 bool no_inferiors = false; 345 bool no_inferiors = false;
346 if ( err == MAILIMAP_NO_ERROR ) { 346 if ( err == MAILIMAP_NO_ERROR ) {
347 current = result->first; 347 current = result->first;
348 for ( int i = result->count; i > 0; i-- ) { 348 for ( int i = result->count; i > 0; i-- ) {
349 list = (mailimap_mailbox_list *) current->data; 349 list = (mailimap_mailbox_list *) current->data;
350 // it is better use the deep copy mechanism of qt itself 350 // it is better use the deep copy mechanism of qt itself
351 // instead of using strdup! 351 // instead of using strdup!
352 temp = list->mb_name; 352 temp = list->mb_name;
353 del = list->mb_delimiter; 353 del = list->mb_delimiter;
354 current = current->next; 354 current = current->next;
355 if ( (bflags = list->mb_flag) ) { 355 if ( (bflags = list->mb_flag) ) {
356 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 356 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
357 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 357 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
358 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 358 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
359 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 359 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
360 no_inferiors = true; 360 no_inferiors = true;
361 } 361 }
362 } 362 }
363 } 363 }
364 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 364 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
365 } 365 }
366 } else { 366 } else {
367 qDebug("error fetching folders: "); 367 qDebug("error fetching folders: ");
368 368
369 } 369 }
370 mailimap_list_result_free( result ); 370 mailimap_list_result_free( result );
371 371
372/* 372/*
373 * second stage - get the other then inbox folders 373 * second stage - get the other then inbox folders
374 */ 374 */
375 mask = "*" ; 375 mask = "*" ;
376 path = account->getPrefix().latin1(); 376 path = account->getPrefix().latin1();
377 if (!path) path = ""; 377 if (!path) path = "";
378 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); 378 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
379 if ( err == MAILIMAP_NO_ERROR ) { 379 if ( err == MAILIMAP_NO_ERROR ) {
380 current = result->first; 380 current = result->first;
381 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { 381 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) {
382 no_inferiors = false; 382 no_inferiors = false;
383 list = (mailimap_mailbox_list *) current->data; 383 list = (mailimap_mailbox_list *) current->data;
384 // it is better use the deep copy mechanism of qt itself 384 // it is better use the deep copy mechanism of qt itself
385 // instead of using strdup! 385 // instead of using strdup!
386 temp = list->mb_name; 386 temp = list->mb_name;
387 if (temp.lower()=="inbox") 387 if (temp.lower()=="inbox")
388 continue; 388 continue;
389 if (temp.lower()==account->getPrefix().lower()) 389 if (temp.lower()==account->getPrefix().lower())
390 continue; 390 continue;
391 if ( (bflags = list->mb_flag) ) { 391 if ( (bflags = list->mb_flag) ) {
392 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 392 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
393 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 393 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
394 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 394 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
395 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 395 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
396 no_inferiors = true; 396 no_inferiors = true;
397 } 397 }
398 } 398 }
399 } 399 }
400 del = list->mb_delimiter; 400 del = list->mb_delimiter;
401 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 401 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
402 } 402 }
403 } else { 403 } else {
404 qDebug("error fetching folders "); 404 qDebug("error fetching folders ");
405 405
406 } 406 }
407 if (result) mailimap_list_result_free( result ); 407 if (result) mailimap_list_result_free( result );
408 return folders; 408 return folders;
409} 409}
410 410
411RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) 411RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
412{ 412{
413 RecMail * m = 0; 413 RecMail * m = 0;
414 mailimap_msg_att_item *item=0; 414 mailimap_msg_att_item *item=0;
415 clistcell *current,*c,*cf; 415 clistcell *current,*c,*cf;
416 mailimap_msg_att_dynamic*flist; 416 mailimap_msg_att_dynamic*flist;
417 mailimap_flag_fetch*cflag; 417 mailimap_flag_fetch*cflag;
418 int size; 418 int size;
419 QBitArray mFlags(7); 419 QBitArray mFlags(7);
420 QStringList addresslist; 420 QStringList addresslist;
421 421
422 if (!m_att) { 422 if (!m_att) {
423 return m; 423 return m;
424 } 424 }
425 m = new RecMail(); 425 m = new RecMail();
426 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { 426 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) {
427 current = c; 427 current = c;
428 size = 0; 428 size = 0;
429 item = (mailimap_msg_att_item*)current->data; 429 item = (mailimap_msg_att_item*)current->data;
430 if ( !item ) 430 if ( !item )
431 continue; 431 continue;
432 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { 432 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) {
433 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; 433 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn;
434 if (!flist || !flist->att_list) { 434 if (!flist || !flist->att_list) {
435 continue; 435 continue;
436 } 436 }
437 cf = flist->att_list->first; 437 cf = flist->att_list->first;
438 if( ! cf ) 438 if( ! cf )
439 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { 439 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) {
440 cflag = (mailimap_flag_fetch*)cf->data; 440 cflag = (mailimap_flag_fetch*)cf->data;
441 if( ! cflag ) 441 if( ! cflag )
442 qDebug("imap:not cflag "); 442 qDebug("imap:not cflag ");
443 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { 443 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) {
444 switch (cflag->fl_flag->fl_type) { 444 switch (cflag->fl_flag->fl_type) {
445 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ 445 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */
446 mFlags.setBit(FLAG_ANSWERED); 446 mFlags.setBit(FLAG_ANSWERED);
447 break; 447 break;
448 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ 448 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */
449 mFlags.setBit(FLAG_FLAGGED); 449 mFlags.setBit(FLAG_FLAGGED);
450 break; 450 break;
451 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ 451 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */
452 mFlags.setBit(FLAG_DELETED); 452 mFlags.setBit(FLAG_DELETED);
453 break; 453 break;
454 case MAILIMAP_FLAG_SEEN: /* \Seen flag */ 454 case MAILIMAP_FLAG_SEEN: /* \Seen flag */
455 mFlags.setBit(FLAG_SEEN); 455 mFlags.setBit(FLAG_SEEN);
456 break; 456 break;
457 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ 457 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */
458 mFlags.setBit(FLAG_DRAFT); 458 mFlags.setBit(FLAG_DRAFT);
459 break; 459 break;
460 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ 460 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */
461 break; 461 break;
462 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ 462 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */
463 break; 463 break;
464 default: 464 default:
465 break; 465 break;
466 } 466 }
467 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { 467 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) {
468 mFlags.setBit(FLAG_RECENT); 468 mFlags.setBit(FLAG_RECENT);
469 } 469 }
470 } 470 }
471 continue; 471 continue;
472 } 472 }
473 if ( item->att_data.att_static == NULL ) 473 if ( item->att_data.att_static == NULL )
474 continue; 474 continue;
475 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { 475 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) {
476 mailimap_envelope * head = item->att_data.att_static->att_data.att_env; 476 mailimap_envelope * head = item->att_data.att_static->att_data.att_env;
477 if ( head == NULL ) 477 if ( head == NULL )
478 continue; 478 continue;
479 if ( head->env_date != NULL ) { 479 if ( head->env_date != NULL ) {
480 m->setDate(head->env_date); 480 m->setDate(head->env_date);
481 struct mailimf_date_time result; 481 //struct mailimf_date_time result;
482 struct mailimf_date_time* date = &result; 482 struct mailimf_date_time* date;// = &result;
483 struct mailimf_date_time **re = &date; 483 struct mailimf_date_time **re = &date;
484 size_t length = m->getDate().length(); 484 size_t length = m->getDate().length();
485 size_t index = 0; 485 size_t index = 0;
486 if ( mailimf_date_time_parse(head->env_date, length,&index, re ) == MAILIMF_NO_ERROR ) { 486 if ( mailimf_date_time_parse(head->env_date, length,&index, re ) == MAILIMF_NO_ERROR ) {
487 QDateTime dt = Genericwrapper::parseDateTime( date ); 487 QDateTime dt = Genericwrapper::parseDateTime( date );
488 QString ret; 488 QString ret;
489 if ( dt.date() == QDate::currentDate () ) 489 if ( dt.date() == QDate::currentDate () )
490 ret = KGlobal::locale()->formatTime( dt.time(),true); 490 ret = KGlobal::locale()->formatTime( dt.time(),true);
491 else { 491 else {
492 ret = KGlobal::locale()->formatDateTime( dt,true,true); 492 ret = KGlobal::locale()->formatDateTime( dt,true,true);
493 } 493 }
494 m->setDate( ret ); 494 m->setDate( ret );
495 char tmp[20]; 495 char tmp[20];
496 snprintf( tmp, 20, "%04i-%02i-%02i %02i:%02i:%02i", 496 snprintf( tmp, 20, "%04i-%02i-%02i %02i:%02i:%02i",
497 dt.date().year(),dt.date().month(), dt.date().day(), dt.time().hour(), dt.time().minute(), dt.time().second() ); 497 dt.date().year(),dt.date().month(), dt.date().day(), dt.time().hour(), dt.time().minute(), dt.time().second() );
498 //qDebug("%d iso %s %s ", date->dt_zone, tmp, head->env_date); 498 //qDebug("%d iso %s %s ", date->dt_zone, tmp, head->env_date);
499 m->setIsoDate( QString( tmp ) ); 499 m->setIsoDate( QString( tmp ) );
500 mailimf_date_time_free ( date );
500 } else { 501 } else {
501 m->setIsoDate(head->env_date); 502 m->setIsoDate(head->env_date);
502 } 503 }
503 } 504 }
504 if ( head->env_subject != NULL ) 505 if ( head->env_subject != NULL )
505 m->setSubject(convert_String((const char*)head->env_subject)); 506 m->setSubject(convert_String((const char*)head->env_subject));
506 //m->setSubject(head->env_subject); 507 //m->setSubject(head->env_subject);
507 if (head->env_from!=NULL) { 508 if (head->env_from!=NULL) {
508 addresslist = address_list_to_stringlist(head->env_from->frm_list); 509 addresslist = address_list_to_stringlist(head->env_from->frm_list);
509 if (addresslist.count()) { 510 if (addresslist.count()) {
510 m->setFrom(addresslist.first()); 511 m->setFrom(addresslist.first());
511 } 512 }
512 } 513 }
513 if (head->env_to!=NULL) { 514 if (head->env_to!=NULL) {
514 addresslist = address_list_to_stringlist(head->env_to->to_list); 515 addresslist = address_list_to_stringlist(head->env_to->to_list);
515 m->setTo(addresslist); 516 m->setTo(addresslist);
516 } 517 }
517 if (head->env_cc!=NULL) { 518 if (head->env_cc!=NULL) {
518 addresslist = address_list_to_stringlist(head->env_cc->cc_list); 519 addresslist = address_list_to_stringlist(head->env_cc->cc_list);
519 m->setCC(addresslist); 520 m->setCC(addresslist);
520 } 521 }
521 if (head->env_bcc!=NULL) { 522 if (head->env_bcc!=NULL) {
522 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list); 523 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list);
523 m->setBcc(addresslist); 524 m->setBcc(addresslist);
524 } 525 }
525 /* reply to address, eg. email. */ 526 /* reply to address, eg. email. */
526 if (head->env_reply_to!=NULL) { 527 if (head->env_reply_to!=NULL) {
527 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list); 528 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list);
528 if (addresslist.count()) { 529 if (addresslist.count()) {
529 m->setReplyto(addresslist.first()); 530 m->setReplyto(addresslist.first());
530 } 531 }
531 } 532 }
532 if (head->env_in_reply_to!=NULL) { 533 if (head->env_in_reply_to!=NULL) {
533 QString h(head->env_in_reply_to); 534 QString h(head->env_in_reply_to);
534 while (h.length()>0 && h[0]=='<') { 535 while (h.length()>0 && h[0]=='<') {
535 h.remove(0,1); 536 h.remove(0,1);
536 } 537 }
537 while (h.length()>0 && h[h.length()-1]=='>') { 538 while (h.length()>0 && h[h.length()-1]=='>') {
538 h.remove(h.length()-1,1); 539 h.remove(h.length()-1,1);
539 } 540 }
540 if (h.length()>0) { 541 if (h.length()>0) {
541 m->setInreply(QStringList(h)); 542 m->setInreply(QStringList(h));
542 } 543 }
543 } 544 }
544 if (head->env_message_id != NULL) { 545 if (head->env_message_id != NULL) {
545 m->setMsgid(QString(head->env_message_id)); 546 m->setMsgid(QString(head->env_message_id));
546 } 547 }
547 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) { 548 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) {
548#if 0 549#if 0
549 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date; 550 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date;
550 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec)); 551 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec));
551 qDebug("time %s ",da.toString().latin1() ); 552 qDebug("time %s ",da.toString().latin1() );
552#endif 553#endif
553 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) { 554 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) {
554 size = item->att_data.att_static->att_data.att_rfc822_size; 555 size = item->att_data.att_static->att_data.att_rfc822_size;
555 } 556 }
556 } 557 }
557 /* msg is already deleted */ 558 /* msg is already deleted */
558 if (mFlags.testBit(FLAG_DELETED) && m) { 559 if (mFlags.testBit(FLAG_DELETED) && m) {
559 delete m; 560 delete m;
560 m = 0; 561 m = 0;
561 } 562 }
562 if (m) { 563 if (m) {
563 m->setFlags(mFlags); 564 m->setFlags(mFlags);
564 m->setMsgsize(size); 565 m->setMsgsize(size);
565 } 566 }
566 return m; 567 return m;
567} 568}
568 569
569RecBodyP IMAPwrapper::fetchBody(const RecMailP&mail) 570RecBodyP IMAPwrapper::fetchBody(const RecMailP&mail)
570{ 571{
571 RecBodyP body = new RecBody(); 572 RecBodyP body = new RecBody();
572 const char *mb; 573 const char *mb;
573 int err = MAILIMAP_NO_ERROR; 574 int err = MAILIMAP_NO_ERROR;
574 clist *result = 0; 575 clist *result = 0;
575 clistcell *current; 576 clistcell *current;
576 mailimap_fetch_att *fetchAtt = 0; 577 mailimap_fetch_att *fetchAtt = 0;
577 mailimap_fetch_type *fetchType = 0; 578 mailimap_fetch_type *fetchType = 0;
578 mailimap_set *set = 0; 579 mailimap_set *set = 0;
579 mailimap_body*body_desc = 0; 580 mailimap_body*body_desc = 0;
580 581
581 mb = mail->getMbox().latin1(); 582 mb = mail->getMbox().latin1();
582 583
583 login(); 584 login();
584 if (!m_imap) { 585 if (!m_imap) {
585 return body; 586 return body;
586 } 587 }
587 err = selectMbox(mail->getMbox()); 588 err = selectMbox(mail->getMbox());
588 if ( err != MAILIMAP_NO_ERROR ) { 589 if ( err != MAILIMAP_NO_ERROR ) {
589 return body; 590 return body;
590 } 591 }
591 592
592 /* the range has to start at 1!!! not with 0!!!! */ 593 /* the range has to start at 1!!! not with 0!!!! */
593 set = mailimap_set_new_interval( mail->getNumber(),mail->getNumber() ); 594 set = mailimap_set_new_interval( mail->getNumber(),mail->getNumber() );
594 fetchAtt = mailimap_fetch_att_new_bodystructure(); 595 fetchAtt = mailimap_fetch_att_new_bodystructure();
595 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 596 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
596 err = mailimap_fetch( m_imap, set, fetchType, &result ); 597 err = mailimap_fetch( m_imap, set, fetchType, &result );
597 mailimap_set_free( set ); 598 mailimap_set_free( set );
598 mailimap_fetch_type_free( fetchType ); 599 mailimap_fetch_type_free( fetchType );
599 600
600 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 601 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
601 mailimap_msg_att * msg_att; 602 mailimap_msg_att * msg_att;
602 msg_att = (mailimap_msg_att*)current->data; 603 msg_att = (mailimap_msg_att*)current->data;
603 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data; 604 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data;
604 QValueList<int> path; 605 QValueList<int> path;
605 body_desc = item->att_data.att_static->att_data.att_body; 606 body_desc = item->att_data.att_static->att_data.att_body;
606 traverseBody(mail,body_desc,body,0,path); 607 traverseBody(mail,body_desc,body,0,path);
607 } else { 608 } else {
608 //odebug << "error fetching body: " << m_imap->imap_response << "" << oendl; 609 //odebug << "error fetching body: " << m_imap->imap_response << "" << oendl;
609 } 610 }
610 if (result) mailimap_fetch_list_free(result); 611 if (result) mailimap_fetch_list_free(result);
611 return body; 612 return body;
612} 613}
613 614
614QStringList IMAPwrapper::address_list_to_stringlist(clist*list) 615QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
615{ 616{
616 QStringList l; 617 QStringList l;
617 QString from; 618 QString from;
618 bool named_from; 619 bool named_from;
619 clistcell *current = NULL; 620 clistcell *current = NULL;
620 mailimap_address * current_address=NULL; 621 mailimap_address * current_address=NULL;
621 if (!list) { 622 if (!list) {
622 return l; 623 return l;
623 } 624 }
624 unsigned int count = 0; 625 unsigned int count = 0;
625 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) { 626 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) {
626 from = ""; 627 from = "";
627 named_from = false; 628 named_from = false;
628 current_address=(mailimap_address*)current->data; 629 current_address=(mailimap_address*)current->data;
629 if (current_address->ad_personal_name){ 630 if (current_address->ad_personal_name){
630 from+=convert_String((const char*)current_address->ad_personal_name); 631 from+=convert_String((const char*)current_address->ad_personal_name);
631 from+=" "; 632 from+=" ";
632 named_from = true; 633 named_from = true;
633 } 634 }
634 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 635 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
635 from+="<"; 636 from+="<";
636 } 637 }
637 if (current_address->ad_mailbox_name) { 638 if (current_address->ad_mailbox_name) {
638 from+=QString(current_address->ad_mailbox_name); 639 from+=QString(current_address->ad_mailbox_name);
639 from+="@"; 640 from+="@";
640 } 641 }
641 if (current_address->ad_host_name) { 642 if (current_address->ad_host_name) {
642 from+=QString(current_address->ad_host_name); 643 from+=QString(current_address->ad_host_name);
643 } 644 }
644 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 645 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
645 from+=">"; 646 from+=">";
646 } 647 }
647 l.append(QString(from)); 648 l.append(QString(from));
648 if (++count > 99) { 649 if (++count > 99) {
649 break; 650 break;
650 } 651 }
651 } 652 }
652 return l; 653 return l;
653} 654}
654 655
655encodedString*IMAPwrapper::fetchRawPart(const RecMailP&mail,const QValueList<int>&path,bool internal_call) 656encodedString*IMAPwrapper::fetchRawPart(const RecMailP&mail,const QValueList<int>&path,bool internal_call)
656{ 657{
657 encodedString*res=new encodedString; 658 encodedString*res=new encodedString;
658 int err; 659 int err;
659 mailimap_fetch_type *fetchType; 660 mailimap_fetch_type *fetchType;
660 mailimap_set *set; 661 mailimap_set *set;
661 clistcell*current,*cur; 662 clistcell*current,*cur;
662 mailimap_section_part * section_part = 0; 663 mailimap_section_part * section_part = 0;
663 mailimap_section_spec * section_spec = 0; 664 mailimap_section_spec * section_spec = 0;
664 mailimap_section * section = 0; 665 mailimap_section * section = 0;
665 mailimap_fetch_att * fetch_att = 0; 666 mailimap_fetch_att * fetch_att = 0;
666 667
667 login(); 668 login();
668 if (!m_imap) { 669 if (!m_imap) {
669 return res; 670 return res;
670 } 671 }
671 if (!internal_call) { 672 if (!internal_call) {
672 err = selectMbox(mail->getMbox()); 673 err = selectMbox(mail->getMbox());
673 if ( err != MAILIMAP_NO_ERROR ) { 674 if ( err != MAILIMAP_NO_ERROR ) {
674 return res; 675 return res;
675 } 676 }
676 } 677 }
677 set = mailimap_set_new_single(mail->getNumber()); 678 set = mailimap_set_new_single(mail->getNumber());
678 679
679 clist*id_list = 0; 680 clist*id_list = 0;
680 681
681 /* if path == empty then its a request for the whole rfc822 mail and generates 682 /* if path == empty then its a request for the whole rfc822 mail and generates
682 a "fetch <id> (body[])" statement on imap server */ 683 a "fetch <id> (body[])" statement on imap server */
683 if (path.count()>0 ) { 684 if (path.count()>0 ) {
684 id_list = clist_new(); 685 id_list = clist_new();
685 for (unsigned j=0; j < path.count();++j) { 686 for (unsigned j=0; j < path.count();++j) {
686 uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id)); 687 uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id));
687 *p_id = path[j]; 688 *p_id = path[j];
688 clist_append(id_list,p_id); 689 clist_append(id_list,p_id);
689 } 690 }
690 section_part = mailimap_section_part_new(id_list); 691 section_part = mailimap_section_part_new(id_list);
691 section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL); 692 section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL);
692 } 693 }
693 694
694 section = mailimap_section_new(section_spec); 695 section = mailimap_section_new(section_spec);
695 fetch_att = mailimap_fetch_att_new_body_section(section); 696 fetch_att = mailimap_fetch_att_new_body_section(section);
696 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att); 697 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att);
697 698
698 clist*result = 0; 699 clist*result = 0;
699 700
700 err = mailimap_fetch( m_imap, set, fetchType, &result ); 701 err = mailimap_fetch( m_imap, set, fetchType, &result );
701 mailimap_set_free( set ); 702 mailimap_set_free( set );
702 mailimap_fetch_type_free( fetchType ); 703 mailimap_fetch_type_free( fetchType );
703 704
704 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 705 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
705 mailimap_msg_att * msg_att; 706 mailimap_msg_att * msg_att;
706 msg_att = (mailimap_msg_att*)current->data; 707 msg_att = (mailimap_msg_att*)current->data;
707 mailimap_msg_att_item*msg_att_item; 708 mailimap_msg_att_item*msg_att_item;
708 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) { 709 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) {
709 msg_att_item = (mailimap_msg_att_item*)clist_content(cur); 710 msg_att_item = (mailimap_msg_att_item*)clist_content(cur);
710 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { 711 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
711 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { 712 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
712 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; 713 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
713 /* detach - we take over the content */ 714 /* detach - we take over the content */
714 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L; 715 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
715 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length); 716 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length);
716 } 717 }
717 } 718 }
718 } 719 }
719 } else { 720 } else {
720 ;//odebug << "error fetching text: " << m_imap->imap_response << "" << oendl; 721 ;//odebug << "error fetching text: " << m_imap->imap_response << "" << oendl;
721 } 722 }
722 if (result) mailimap_fetch_list_free(result); 723 if (result) mailimap_fetch_list_free(result);
723 return res; 724 return res;
724} 725}
725 726
726/* current_recursion is for recursive calls. 727/* current_recursion is for recursive calls.
727 current_count means the position inside the internal loop! */ 728 current_count means the position inside the internal loop! */
728void IMAPwrapper::traverseBody(const RecMailP&mail,mailimap_body*body,RecBodyP&target_body, 729void IMAPwrapper::traverseBody(const RecMailP&mail,mailimap_body*body,RecBodyP&target_body,
729 int current_recursion,QValueList<int>recList,int current_count) 730 int current_recursion,QValueList<int>recList,int current_count)
730{ 731{
731 if (!body || current_recursion>=10) { 732 if (!body || current_recursion>=10) {
732 return; 733 return;
733 } 734 }
734 switch (body->bd_type) { 735 switch (body->bd_type) {
735 case MAILIMAP_BODY_1PART: 736 case MAILIMAP_BODY_1PART:
736 { 737 {
737 QValueList<int>countlist = recList; 738 QValueList<int>countlist = recList;
738 countlist.append(current_count); 739 countlist.append(current_count);
739 RecPartP currentPart = new RecPart(); 740 RecPartP currentPart = new RecPart();
740 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part; 741 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part;
741 QString id(""); 742 QString id("");
742 currentPart->setPositionlist(countlist); 743 currentPart->setPositionlist(countlist);
743 for (unsigned int j = 0; j < countlist.count();++j) { 744 for (unsigned int j = 0; j < countlist.count();++j) {
744 id+=(j>0?" ":""); 745 id+=(j>0?" ":"");
745 id+=QString("%1").arg(countlist[j]); 746 id+=QString("%1").arg(countlist[j]);
746 } 747 }
747 //odebug << "ID = " << id.latin1() << "" << oendl; 748 //odebug << "ID = " << id.latin1() << "" << oendl;
748 currentPart->setIdentifier(id); 749 currentPart->setIdentifier(id);
749 fillSinglePart(currentPart,part1); 750 fillSinglePart(currentPart,part1);
750 /* important: Check for is NULL 'cause a body can be empty! 751 /* important: Check for is NULL 'cause a body can be empty!
751 And we put it only into the mail if it is the FIRST part */ 752 And we put it only into the mail if it is the FIRST part */
752 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body->Bodytext().isNull() && countlist[0]==1) { 753 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body->Bodytext().isNull() && countlist[0]==1) {
753 QString body_text = fetchTextPart(mail,countlist,true,currentPart->Encoding()); 754 QString body_text = fetchTextPart(mail,countlist,true,currentPart->Encoding());
754 //qDebug("encoding %d text %s ",currentPart->Encoding().latin1(), body_text.latin1() ); 755 //qDebug("encoding %d text %s ",currentPart->Encoding().latin1(), body_text.latin1() );
755 target_body->setDescription(currentPart); 756 target_body->setDescription(currentPart);
756 target_body->setBodytext(body_text); 757 target_body->setBodytext(body_text);
757 if (countlist.count()>1) { 758 if (countlist.count()>1) {
758 target_body->addPart(currentPart); 759 target_body->addPart(currentPart);
759 } 760 }
760 } else { 761 } else {
761 target_body->addPart(currentPart); 762 target_body->addPart(currentPart);
762 } 763 }
763 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) { 764 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) {
764 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist); 765 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist);
765 } 766 }
766 } 767 }
767 break; 768 break;
768 case MAILIMAP_BODY_MPART: 769 case MAILIMAP_BODY_MPART:
769 { 770 {
770 QValueList<int>countlist = recList; 771 QValueList<int>countlist = recList;
771 clistcell*current=0; 772 clistcell*current=0;
772 mailimap_body*current_body=0; 773 mailimap_body*current_body=0;
773 unsigned int ccount = 1; 774 unsigned int ccount = 1;
774 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart; 775 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart;
775 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) { 776 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) {
776 current_body = (mailimap_body*)current->data; 777 current_body = (mailimap_body*)current->data;
777 if (current_body->bd_type==MAILIMAP_BODY_MPART) { 778 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
778 RecPartP targetPart = new RecPart(); 779 RecPartP targetPart = new RecPart();
779 targetPart->setType("multipart"); 780 targetPart->setType("multipart");
780 fillMultiPart(targetPart,mailDescription); 781 fillMultiPart(targetPart,mailDescription);
781 countlist.append(current_count); 782 countlist.append(current_count);
782 targetPart->setPositionlist(countlist); 783 targetPart->setPositionlist(countlist);
783 target_body->addPart(targetPart); 784 target_body->addPart(targetPart);
784 QString id(""); 785 QString id("");
785 for (unsigned int j = 0; j < countlist.count();++j) { 786 for (unsigned int j = 0; j < countlist.count();++j) {
786 id+=(j>0?" ":""); 787 id+=(j>0?" ":"");
787 id+=QString("%1").arg(countlist[j]); 788 id+=QString("%1").arg(countlist[j]);
788 } 789 }
789 // odebug << "ID(mpart) = " << id.latin1() << "" << oendl; 790 // odebug << "ID(mpart) = " << id.latin1() << "" << oendl;
790 } 791 }
791 traverseBody(mail,current_body,target_body,current_recursion+1,countlist,ccount); 792 traverseBody(mail,current_body,target_body,current_recursion+1,countlist,ccount);
792 if (current_body->bd_type==MAILIMAP_BODY_MPART) { 793 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
793 countlist = recList; 794 countlist = recList;
794 } 795 }
795 ++ccount; 796 ++ccount;
796 } 797 }
797 } 798 }
798 break; 799 break;
799 default: 800 default:
800 break; 801 break;
801 } 802 }
802} 803}
803 804
804void IMAPwrapper::fillSinglePart(RecPartP&target_part,mailimap_body_type_1part*Description) 805void IMAPwrapper::fillSinglePart(RecPartP&target_part,mailimap_body_type_1part*Description)
805{ 806{
806 if (!Description) { 807 if (!Description) {
807 return; 808 return;
808 } 809 }
809 switch (Description->bd_type) { 810 switch (Description->bd_type) {
810 case MAILIMAP_BODY_TYPE_1PART_TEXT: 811 case MAILIMAP_BODY_TYPE_1PART_TEXT:
811 target_part->setType("text"); 812 target_part->setType("text");
812 fillSingleTextPart(target_part,Description->bd_data.bd_type_text); 813 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
813 break; 814 break;
814 case MAILIMAP_BODY_TYPE_1PART_BASIC: 815 case MAILIMAP_BODY_TYPE_1PART_BASIC:
815 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); 816 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
816 break; 817 break;
817 case MAILIMAP_BODY_TYPE_1PART_MSG: 818 case MAILIMAP_BODY_TYPE_1PART_MSG:
818 target_part->setType("message"); 819 target_part->setType("message");
819 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg); 820 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg);
820 break; 821 break;
821 default: 822 default:
822 break; 823 break;
823 } 824 }
824} 825}
825 826
826void IMAPwrapper::fillSingleTextPart(RecPartP&target_part,mailimap_body_type_text*which) 827void IMAPwrapper::fillSingleTextPart(RecPartP&target_part,mailimap_body_type_text*which)
827{ 828{
828 if (!which) { 829 if (!which) {
829 return; 830 return;
830 } 831 }
831 QString sub; 832 QString sub;
832 sub = which->bd_media_text; 833 sub = which->bd_media_text;
833 //odebug << "Type= text/" << which->bd_media_text << "" << oendl; 834 //odebug << "Type= text/" << which->bd_media_text << "" << oendl;
834 target_part->setSubtype(sub.lower()); 835 target_part->setSubtype(sub.lower());
835 target_part->setLines(which->bd_lines); 836 target_part->setLines(which->bd_lines);
836 fillBodyFields(target_part,which->bd_fields); 837 fillBodyFields(target_part,which->bd_fields);
837} 838}
838 839
839void IMAPwrapper::fillSingleMsgPart(RecPartP&target_part,mailimap_body_type_msg*which) 840void IMAPwrapper::fillSingleMsgPart(RecPartP&target_part,mailimap_body_type_msg*which)
840{ 841{
841 if (!which) { 842 if (!which) {
842 return; 843 return;
843 } 844 }
844 target_part->setSubtype("rfc822"); 845 target_part->setSubtype("rfc822");
845 //odebug << "Message part" << oendl; 846 //odebug << "Message part" << oendl;
846 /* we set this type to text/plain */ 847 /* we set this type to text/plain */
847 target_part->setLines(which->bd_lines); 848 target_part->setLines(which->bd_lines);
848 fillBodyFields(target_part,which->bd_fields); 849 fillBodyFields(target_part,which->bd_fields);
849} 850}
850 851
851void IMAPwrapper::fillMultiPart(RecPartP&target_part,mailimap_body_type_mpart*which) 852void IMAPwrapper::fillMultiPart(RecPartP&target_part,mailimap_body_type_mpart*which)
852{ 853{
853 if (!which) return; 854 if (!which) return;
854 QString sub = which->bd_media_subtype; 855 QString sub = which->bd_media_subtype;
855 target_part->setSubtype(sub.lower()); 856 target_part->setSubtype(sub.lower());
856 if (which->bd_ext_mpart && which->bd_ext_mpart->bd_parameter && which->bd_ext_mpart->bd_parameter->pa_list) { 857 if (which->bd_ext_mpart && which->bd_ext_mpart->bd_parameter && which->bd_ext_mpart->bd_parameter->pa_list) {
857 clistcell*cur = 0; 858 clistcell*cur = 0;
858 mailimap_single_body_fld_param*param=0; 859 mailimap_single_body_fld_param*param=0;
859 for (cur = clist_begin(which->bd_ext_mpart->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { 860 for (cur = clist_begin(which->bd_ext_mpart->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
860 param = (mailimap_single_body_fld_param*)cur->data; 861 param = (mailimap_single_body_fld_param*)cur->data;
861 if (param) { 862 if (param) {
862 target_part->addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); 863 target_part->addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
863 } 864 }
864 } 865 }
865 } 866 }
866} 867}
867 868
868void IMAPwrapper::fillSingleBasicPart(RecPartP&target_part,mailimap_body_type_basic*which) 869void IMAPwrapper::fillSingleBasicPart(RecPartP&target_part,mailimap_body_type_basic*which)
869{ 870{
870 if (!which) { 871 if (!which) {
871 return; 872 return;
872 } 873 }
873 QString type,sub; 874 QString type,sub;
874 switch (which->bd_media_basic->med_type) { 875 switch (which->bd_media_basic->med_type) {
875 case MAILIMAP_MEDIA_BASIC_APPLICATION: 876 case MAILIMAP_MEDIA_BASIC_APPLICATION:
876 type = "application"; 877 type = "application";
877 break; 878 break;
878 case MAILIMAP_MEDIA_BASIC_AUDIO: 879 case MAILIMAP_MEDIA_BASIC_AUDIO:
879 type = "audio"; 880 type = "audio";
880 break; 881 break;
881 case MAILIMAP_MEDIA_BASIC_IMAGE: 882 case MAILIMAP_MEDIA_BASIC_IMAGE:
882 type = "image"; 883 type = "image";
883 break; 884 break;
diff --git a/kmicromail/libmailwrapper/settings.cpp b/kmicromail/libmailwrapper/settings.cpp
index 5d2c0ad..04afe7c 100644
--- a/kmicromail/libmailwrapper/settings.cpp
+++ b/kmicromail/libmailwrapper/settings.cpp
@@ -1,407 +1,408 @@
1#include <stdlib.h> 1#include <stdlib.h>
2#include <qdir.h> 2#include <qdir.h>
3 3
4//#include <opie2/odebug.h> 4//#include <opie2/odebug.h>
5#include <kconfig.h> 5#include <kconfig.h>
6 6
7#include <kstandarddirs.h> 7#include <kstandarddirs.h>
8#include "settings.h" 8#include "settings.h"
9//#include "defines.h" 9//#include "defines.h"
10 10
11#define IMAP_PORT "143" 11#define IMAP_PORT "143"
12#define IMAP_SSL_PORT "993" 12#define IMAP_SSL_PORT "993"
13#define SMTP_PORT "25" 13#define SMTP_PORT "25"
14#define SMTP_SSL_PORT "465" 14#define SMTP_SSL_PORT "465"
15#define POP3_PORT "110" 15#define POP3_PORT "110"
16#define POP3_SSL_PORT "995" 16#define POP3_SSL_PORT "995"
17#define NNTP_PORT "119" 17#define NNTP_PORT "119"
18#define NNTP_SSL_PORT "563" 18#define NNTP_SSL_PORT "563"
19 19
20 20
21Settings::Settings() 21Settings::Settings()
22 : QObject() 22 : QObject()
23{ 23{
24 accounts.setAutoDelete( true ); ;
24 updateAccounts(); 25 updateAccounts();
25 //qDebug("++++++++++++++++++new settings "); 26 //qDebug("++++++++++++++++++new settings ");
26} 27}
27 28
28void Settings::checkDirectory() 29void Settings::checkDirectory()
29{ 30{
30 return; 31 return;
31 locateLocal("data", "kopiemail" ); 32 locateLocal("data", "kopiemail" );
32 /* 33 /*
33 if ( !QDir( (QString) getenv( "HOME" ) + "/Applications/opiemail/" ).exists() ) { 34 if ( !QDir( (QString) getenv( "HOME" ) + "/Applications/opiemail/" ).exists() ) {
34 system( "mkdir -p $HOME/Applications/opiemail" ); 35 system( "mkdir -p $HOME/Applications/opiemail" );
35 qDebug("$HOME/Applications/opiemail created "); 36 qDebug("$HOME/Applications/opiemail created ");
36 } 37 }
37 */ 38 */
38} 39}
39 40
40QList<Account> Settings::getAccounts() 41QList<Account> Settings::getAccounts()
41{ 42{
42 return accounts; 43 return accounts;
43} 44}
44 45
45void Settings::addAccount( Account *account ) 46void Settings::addAccount( Account *account )
46{ 47{
47 accounts.append( account ); 48 accounts.append( account );
48} 49}
49 50
50void Settings::delAccount( Account *account ) 51void Settings::delAccount( Account *account )
51{ 52{
52 accounts.remove( account ); 53 accounts.remove( account );
53 account->remove(); 54 account->remove();
54} 55}
55 56
56void Settings::updateAccounts() 57void Settings::updateAccounts()
57{ 58{
58 accounts.clear(); 59 accounts.clear();
59 QDir dir( locateLocal("data", "kopiemail" ) ); 60 QDir dir( locateLocal("data", "kopiemail" ) );
60 QStringList::Iterator it; 61 QStringList::Iterator it;
61 62
62 QStringList imap = dir.entryList( "imap-*" ); 63 QStringList imap = dir.entryList( "imap-*" );
63 for ( it = imap.begin(); it != imap.end(); it++ ) { 64 for ( it = imap.begin(); it != imap.end(); it++ ) {
64 IMAPaccount *account = new IMAPaccount( (*it).replace(0, 5, "") ); 65 IMAPaccount *account = new IMAPaccount( (*it).replace(0, 5, "") );
65 accounts.append( account ); 66 accounts.append( account );
66 } 67 }
67 68
68 QStringList pop3 = dir.entryList( "pop3-*" ); 69 QStringList pop3 = dir.entryList( "pop3-*" );
69 for ( it = pop3.begin(); it != pop3.end(); it++ ) { 70 for ( it = pop3.begin(); it != pop3.end(); it++ ) {
70 POP3account *account = new POP3account( (*it).replace(0, 5, "") ); 71 POP3account *account = new POP3account( (*it).replace(0, 5, "") );
71 accounts.append( account ); 72 accounts.append( account );
72 } 73 }
73 74
74 QStringList smtp = dir.entryList( "smtp-*" ); 75 QStringList smtp = dir.entryList( "smtp-*" );
75 for ( it = smtp.begin(); it != smtp.end(); it++ ) { 76 for ( it = smtp.begin(); it != smtp.end(); it++ ) {
76 SMTPaccount *account = new SMTPaccount( (*it).replace(0, 5, "") ); 77 SMTPaccount *account = new SMTPaccount( (*it).replace(0, 5, "") );
77 accounts.append( account ); 78 accounts.append( account );
78 } 79 }
79 80
80 QStringList nntp = dir.entryList( "nntp-*" ); 81 QStringList nntp = dir.entryList( "nntp-*" );
81 for ( it = nntp.begin(); it != nntp.end(); it++ ) { 82 for ( it = nntp.begin(); it != nntp.end(); it++ ) {
82 NNTPaccount *account = new NNTPaccount( (*it).replace(0, 5, "") ); 83 NNTPaccount *account = new NNTPaccount( (*it).replace(0, 5, "") );
83 accounts.append( account ); 84 accounts.append( account );
84 } 85 }
85 86
86 readAccounts(); 87 readAccounts();
87} 88}
88 89
89void Settings::saveAccounts() 90void Settings::saveAccounts()
90{ 91{
91 checkDirectory(); 92 checkDirectory();
92 Account *it; 93 Account *it;
93 94
94 for ( it = accounts.first(); it; it = accounts.next() ) { 95 for ( it = accounts.first(); it; it = accounts.next() ) {
95 it->save(); 96 it->save();
96 } 97 }
97} 98}
98 99
99void Settings::readAccounts() 100void Settings::readAccounts()
100{ 101{
101 checkDirectory(); 102 checkDirectory();
102 Account *it; 103 Account *it;
103 104
104 for ( it = accounts.first(); it; it = accounts.next() ) { 105 for ( it = accounts.first(); it; it = accounts.next() ) {
105 it->read(); 106 it->read();
106 } 107 }
107} 108}
108 109
109Account::Account() 110Account::Account()
110{ 111{
111 accountName = "changeMe"; 112 accountName = "changeMe";
112 type = MAILLIB::A_UNDEFINED; 113 type = MAILLIB::A_UNDEFINED;
113 ssl = false; 114 ssl = false;
114 connectionType = 1; 115 connectionType = 1;
115 offline = false; 116 offline = false;
116 maxMailSize = 0; 117 maxMailSize = 0;
117 lastFetch; 118 lastFetch;
118 leaveOnServer = false; 119 leaveOnServer = false;
119} 120}
120 121
121void Account::remove() 122void Account::remove()
122{ 123{
123 QFile file( getFileName() ); 124 QFile file( getFileName() );
124 file.remove(); 125 file.remove();
125} 126}
126 127
127void Account::setPasswordList(const QStringList &str) 128void Account::setPasswordList(const QStringList &str)
128{ 129{
129 password = ""; 130 password = "";
130 int i; 131 int i;
131 for ( i = 0; i < str.count() ; ++i ) { 132 for ( i = 0; i < str.count() ; ++i ) {
132 QChar c ( (str[i].toUInt()-131)/(str.count()- (i%3))); 133 QChar c ( (str[i].toUInt()-131)/(str.count()- (i%3)));
133 password.append( c ); 134 password.append( c );
134 } 135 }
135 //qDebug("password %s ", password.latin1()); 136 //qDebug("password %s ", password.latin1());
136} 137}
137QStringList Account::getPasswordList() 138QStringList Account::getPasswordList()
138{ 139{
139 int i; 140 int i;
140 int len = password.length(); 141 int len = password.length();
141 QStringList str; 142 QStringList str;
142 143
143 for ( i = 0; i < len ; ++i ) { 144 for ( i = 0; i < len ; ++i ) {
144 int val = password.at(i).unicode()*(len-(i%3))+131; 145 int val = password.at(i).unicode()*(len-(i%3))+131;
145 str.append( QString::number( val ) ); 146 str.append( QString::number( val ) );
146 // qDebug("append %s ", str[i].latin1()); 147 // qDebug("append %s ", str[i].latin1());
147 } 148 }
148 return str; 149 return str;
149} 150}
150 151
151IMAPaccount::IMAPaccount() 152IMAPaccount::IMAPaccount()
152 : Account() 153 : Account()
153{ 154{
154 file = IMAPaccount::getUniqueFileName(); 155 file = IMAPaccount::getUniqueFileName();
155 accountName = "New IMAP Account"; 156 accountName = "New IMAP Account";
156 ssl = false; 157 ssl = false;
157 connectionType = 1; 158 connectionType = 1;
158 type = MAILLIB::A_IMAP; 159 type = MAILLIB::A_IMAP;
159 port = IMAP_PORT; 160 port = IMAP_PORT;
160} 161}
161 162
162IMAPaccount::IMAPaccount( QString filename ) 163IMAPaccount::IMAPaccount( QString filename )
163 : Account() 164 : Account()
164{ 165{
165 file = filename; 166 file = filename;
166 accountName = "New IMAP Account"; 167 accountName = "New IMAP Account";
167 ssl = false; 168 ssl = false;
168 connectionType = 1; 169 connectionType = 1;
169 type = MAILLIB::A_IMAP; 170 type = MAILLIB::A_IMAP;
170 port = IMAP_PORT; 171 port = IMAP_PORT;
171} 172}
172 173
173QString IMAPaccount::getUniqueFileName() 174QString IMAPaccount::getUniqueFileName()
174{ 175{
175 int num = 0; 176 int num = 0;
176 QString unique; 177 QString unique;
177 178
178 QDir dir( locateLocal("data", "kopiemail" ) ); 179 QDir dir( locateLocal("data", "kopiemail" ) );
179 180
180 QStringList imap = dir.entryList( "imap-*" ); 181 QStringList imap = dir.entryList( "imap-*" );
181 do { 182 do {
182 unique.setNum( num++ ); 183 unique.setNum( num++ );
183 } while ( imap.contains( "imap-" + unique ) > 0 ); 184 } while ( imap.contains( "imap-" + unique ) > 0 );
184 185
185 return unique; 186 return unique;
186} 187}
187 188
188void IMAPaccount::read() 189void IMAPaccount::read()
189{ 190{
190 KConfig *conf = new KConfig( getFileName() ); 191 KConfig *conf = new KConfig( getFileName() );
191 conf->setGroup( "IMAP Account" ); 192 conf->setGroup( "IMAP Account" );
192 accountName = conf->readEntry( "Account","" ); 193 accountName = conf->readEntry( "Account","" );
193 if (accountName.isNull()) accountName = ""; 194 if (accountName.isNull()) accountName = "";
194 server = conf->readEntry( "Server","" ); 195 server = conf->readEntry( "Server","" );
195 if (server.isNull()) server=""; 196 if (server.isNull()) server="";
196 port = conf->readEntry( "Port","" ); 197 port = conf->readEntry( "Port","" );
197 if (port.isNull()) port="143"; 198 if (port.isNull()) port="143";
198 connectionType = conf->readNumEntry( "ConnectionType" ); 199 connectionType = conf->readNumEntry( "ConnectionType" );
199 ssl = conf->readBoolEntry( "SSL",false ); 200 ssl = conf->readBoolEntry( "SSL",false );
200 user = conf->readEntry( "User","" ); 201 user = conf->readEntry( "User","" );
201 if (user.isNull()) user = ""; 202 if (user.isNull()) user = "";
202 //password = conf->readEntryCrypt( "Password","" ); 203 //password = conf->readEntryCrypt( "Password","" );
203 setPasswordList( conf->readListEntry( "FolderHistory")); 204 setPasswordList( conf->readListEntry( "FolderHistory"));
204 if (password.isNull()) password = ""; 205 if (password.isNull()) password = "";
205 prefix = conf->readEntry("MailPrefix",""); 206 prefix = conf->readEntry("MailPrefix","");
206 if (prefix.isNull()) prefix = ""; 207 if (prefix.isNull()) prefix = "";
207 offline = conf->readBoolEntry("Offline",false); 208 offline = conf->readBoolEntry("Offline",false);
208 localFolder = conf->readEntry( "LocalFolder" ); 209 localFolder = conf->readEntry( "LocalFolder" );
209 maxMailSize = conf->readNumEntry( "MaxSize",0 ); 210 maxMailSize = conf->readNumEntry( "MaxSize",0 );
210 int lf = conf->readNumEntry( "LastFetch",0 ); 211 int lf = conf->readNumEntry( "LastFetch",0 );
211 QDateTime dt ( QDate ( 2004, 1, 1 ), QTime( 0,0,0) ); 212 QDateTime dt ( QDate ( 2004, 1, 1 ), QTime( 0,0,0) );
212 leaveOnServer = conf->readBoolEntry("LeaveOnServer",false); 213 leaveOnServer = conf->readBoolEntry("LeaveOnServer",false);
213 if ( lf < 0 ) lf = 0; 214 if ( lf < 0 ) lf = 0;
214 lastFetch = dt.addSecs( lf ); 215 lastFetch = dt.addSecs( lf );
215 delete conf; 216 delete conf;
216} 217}
217 218
218void IMAPaccount::save() 219void IMAPaccount::save()
219{ 220{
220 221
221 Settings::checkDirectory(); 222 Settings::checkDirectory();
222 223
223 KConfig *conf = new KConfig( getFileName() ); 224 KConfig *conf = new KConfig( getFileName() );
224 conf->setGroup( "IMAP Account" ); 225 conf->setGroup( "IMAP Account" );
225 conf->writeEntry( "Account", accountName ); 226 conf->writeEntry( "Account", accountName );
226 conf->writeEntry( "Server", server ); 227 conf->writeEntry( "Server", server );
227 conf->writeEntry( "Port", port ); 228 conf->writeEntry( "Port", port );
228 conf->writeEntry( "SSL", ssl ); 229 conf->writeEntry( "SSL", ssl );
229 conf->writeEntry( "ConnectionType", connectionType ); 230 conf->writeEntry( "ConnectionType", connectionType );
230 conf->writeEntry( "User", user ); 231 conf->writeEntry( "User", user );
231 //conf->writeEntryCrypt( "Password", password ); 232 //conf->writeEntryCrypt( "Password", password );
232 conf->writeEntry( "FolderHistory",getPasswordList() ); 233 conf->writeEntry( "FolderHistory",getPasswordList() );
233 conf->writeEntry( "MailPrefix",prefix); 234 conf->writeEntry( "MailPrefix",prefix);
234 conf->writeEntry( "Offline",offline); 235 conf->writeEntry( "Offline",offline);
235 conf->writeEntry( "LocalFolder", localFolder ); 236 conf->writeEntry( "LocalFolder", localFolder );
236 conf->writeEntry( "MaxSize", maxMailSize ); 237 conf->writeEntry( "MaxSize", maxMailSize );
237 QDateTime dt ( QDate ( 2004, 1, 1 ), QTime( 0,0,0) ); 238 QDateTime dt ( QDate ( 2004, 1, 1 ), QTime( 0,0,0) );
238 int lf = dt.secsTo ( lastFetch ); 239 int lf = dt.secsTo ( lastFetch );
239 conf->writeEntry( "LastFetch", lf ); 240 conf->writeEntry( "LastFetch", lf );
240 conf->writeEntry( "LeaveOnServer", leaveOnServer); 241 conf->writeEntry( "LeaveOnServer", leaveOnServer);
241 conf->sync(); 242 conf->sync();
242 delete conf; 243 delete conf;
243} 244}
244 245
245 246
246QString IMAPaccount::getFileName() 247QString IMAPaccount::getFileName()
247{ 248{
248 return locateLocal("data", "kopiemail" ) +"/imap-" + file; 249 return locateLocal("data", "kopiemail" ) +"/imap-" + file;
249} 250}
250 251
251POP3account::POP3account() 252POP3account::POP3account()
252 : Account() 253 : Account()
253{ 254{
254 file = POP3account::getUniqueFileName(); 255 file = POP3account::getUniqueFileName();
255 accountName = "New POP3 Account"; 256 accountName = "New POP3 Account";
256 ssl = false; 257 ssl = false;
257 connectionType = 1; 258 connectionType = 1;
258 type = MAILLIB::A_POP3; 259 type = MAILLIB::A_POP3;
259 port = POP3_PORT; 260 port = POP3_PORT;
260} 261}
261 262
262POP3account::POP3account( QString filename ) 263POP3account::POP3account( QString filename )
263 : Account() 264 : Account()
264{ 265{
265 file = filename; 266 file = filename;
266 accountName = "New POP3 Account"; 267 accountName = "New POP3 Account";
267 ssl = false; 268 ssl = false;
268 connectionType = 1; 269 connectionType = 1;
269 type = MAILLIB::A_POP3; 270 type = MAILLIB::A_POP3;
270 port = POP3_PORT; 271 port = POP3_PORT;
271} 272}
272 273
273QString POP3account::getUniqueFileName() 274QString POP3account::getUniqueFileName()
274{ 275{
275 int num = 0; 276 int num = 0;
276 QString unique; 277 QString unique;
277 278
278 QDir dir( locateLocal("data", "kopiemail" ) ); 279 QDir dir( locateLocal("data", "kopiemail" ) );
279 280
280 QStringList imap = dir.entryList( "pop3-*" ); 281 QStringList imap = dir.entryList( "pop3-*" );
281 do { 282 do {
282 unique.setNum( num++ ); 283 unique.setNum( num++ );
283 } while ( imap.contains( "pop3-" + unique ) > 0 ); 284 } while ( imap.contains( "pop3-" + unique ) > 0 );
284 285
285 return unique; 286 return unique;
286} 287}
287 288
288void POP3account::read() 289void POP3account::read()
289{ 290{
290 KConfig *conf = new KConfig( getFileName()); 291 KConfig *conf = new KConfig( getFileName());
291 conf->setGroup( "POP3 Account" ); 292 conf->setGroup( "POP3 Account" );
292 accountName = conf->readEntry( "Account" ); 293 accountName = conf->readEntry( "Account" );
293 server = conf->readEntry( "Server" ); 294 server = conf->readEntry( "Server" );
294 port = conf->readEntry( "Port" ); 295 port = conf->readEntry( "Port" );
295 ssl = conf->readBoolEntry( "SSL" ); 296 ssl = conf->readBoolEntry( "SSL" );
296 connectionType = conf->readNumEntry( "ConnectionType" ); 297 connectionType = conf->readNumEntry( "ConnectionType" );
297 user = conf->readEntry( "User" ); 298 user = conf->readEntry( "User" );
298 //password = conf->readEntryCrypt( "Password" ); 299 //password = conf->readEntryCrypt( "Password" );
299 setPasswordList( conf->readListEntry( "FolderHistory")); 300 setPasswordList( conf->readListEntry( "FolderHistory"));
300 offline = conf->readBoolEntry("Offline",false); 301 offline = conf->readBoolEntry("Offline",false);
301 localFolder = conf->readEntry( "LocalFolder" ); 302 localFolder = conf->readEntry( "LocalFolder" );
302 maxMailSize = conf->readNumEntry( "MaxSize",0 ); 303 maxMailSize = conf->readNumEntry( "MaxSize",0 );
303 int lf = conf->readNumEntry( "LastFetch",0 ); 304 int lf = conf->readNumEntry( "LastFetch",0 );
304 QDateTime dt ( QDate ( 2004, 1, 1 ), QTime( 0,0,0) ); 305 QDateTime dt ( QDate ( 2004, 1, 1 ), QTime( 0,0,0) );
305 leaveOnServer = conf->readBoolEntry("LeaveOnServer",false); 306 leaveOnServer = conf->readBoolEntry("LeaveOnServer",false);
306 lastFetch = dt.addSecs( lf ); 307 lastFetch = dt.addSecs( lf );
307 delete conf; 308 delete conf;
308} 309}
309 310
310void POP3account::save() 311void POP3account::save()
311{ 312{
312 Settings::checkDirectory(); 313 Settings::checkDirectory();
313 314
314 KConfig *conf = new KConfig( getFileName() ); 315 KConfig *conf = new KConfig( getFileName() );
315 conf->setGroup( "POP3 Account" ); 316 conf->setGroup( "POP3 Account" );
316 conf->writeEntry( "Account", accountName ); 317 conf->writeEntry( "Account", accountName );
317 conf->writeEntry( "Server", server ); 318 conf->writeEntry( "Server", server );
318 conf->writeEntry( "Port", port ); 319 conf->writeEntry( "Port", port );
319 conf->writeEntry( "SSL", ssl ); 320 conf->writeEntry( "SSL", ssl );
320 conf->writeEntry( "ConnectionType", connectionType ); 321 conf->writeEntry( "ConnectionType", connectionType );
321 conf->writeEntry( "User", user ); 322 conf->writeEntry( "User", user );
322 //conf->writeEntryCrypt( "Password", password ); 323 //conf->writeEntryCrypt( "Password", password );
323 conf->writeEntry( "FolderHistory",getPasswordList() ); 324 conf->writeEntry( "FolderHistory",getPasswordList() );
324 conf->writeEntry( "Offline",offline); 325 conf->writeEntry( "Offline",offline);
325 conf->writeEntry( "LocalFolder", localFolder ); 326 conf->writeEntry( "LocalFolder", localFolder );
326 conf->writeEntry( "MaxSize", maxMailSize ); 327 conf->writeEntry( "MaxSize", maxMailSize );
327 QDateTime dt ( QDate ( 2004, 1, 1 ), QTime( 0,0,0) ); 328 QDateTime dt ( QDate ( 2004, 1, 1 ), QTime( 0,0,0) );
328 int lf = dt.secsTo ( lastFetch ); 329 int lf = dt.secsTo ( lastFetch );
329 conf->writeEntry( "LastFetch", lf ); 330 conf->writeEntry( "LastFetch", lf );
330 conf->writeEntry( "LeaveOnServer", leaveOnServer); 331 conf->writeEntry( "LeaveOnServer", leaveOnServer);
331 conf->sync(); 332 conf->sync();
332 delete conf; 333 delete conf;
333} 334}
334 335
335 336
336QString POP3account::getFileName() 337QString POP3account::getFileName()
337{ 338{
338 return locateLocal("data", "kopiemail" ) +"/pop3-" + file; 339 return locateLocal("data", "kopiemail" ) +"/pop3-" + file;
339} 340}
340 341
341SMTPaccount::SMTPaccount() 342SMTPaccount::SMTPaccount()
342 : Account() 343 : Account()
343{ 344{
344 file = SMTPaccount::getUniqueFileName(); 345 file = SMTPaccount::getUniqueFileName();
345 accountName = "New SMTP Account"; 346 accountName = "New SMTP Account";
346 ssl = false; 347 ssl = false;
347 connectionType = 1; 348 connectionType = 1;
348 login = false; 349 login = false;
349 useCC = false; 350 useCC = false;
350 useBCC = false; 351 useBCC = false;
351 useReply = false; 352 useReply = false;
352 type = MAILLIB::A_SMTP; 353 type = MAILLIB::A_SMTP;
353 port = SMTP_PORT; 354 port = SMTP_PORT;
354} 355}
355 356
356SMTPaccount::SMTPaccount( QString filename ) 357SMTPaccount::SMTPaccount( QString filename )
357 : Account() 358 : Account()
358{ 359{
359 file = filename; 360 file = filename;
360 accountName = "New SMTP Account"; 361 accountName = "New SMTP Account";
361 ssl = false; 362 ssl = false;
362 connectionType = 1; 363 connectionType = 1;
363 login = false; 364 login = false;
364 type = MAILLIB::A_SMTP; 365 type = MAILLIB::A_SMTP;
365 port = SMTP_PORT; 366 port = SMTP_PORT;
366} 367}
367 368
368QString SMTPaccount::getUniqueFileName() 369QString SMTPaccount::getUniqueFileName()
369{ 370{
370 int num = 0; 371 int num = 0;
371 QString unique; 372 QString unique;
372 373
373 QDir dir( locateLocal("data", "kopiemail" ) ); 374 QDir dir( locateLocal("data", "kopiemail" ) );
374 375
375 QStringList imap = dir.entryList( "smtp-*" ); 376 QStringList imap = dir.entryList( "smtp-*" );
376 do { 377 do {
377 unique.setNum( num++ ); 378 unique.setNum( num++ );
378 } while ( imap.contains( "smtp-" + unique ) > 0 ); 379 } while ( imap.contains( "smtp-" + unique ) > 0 );
379 380
380 return unique; 381 return unique;
381} 382}
382 383
383void SMTPaccount::read() 384void SMTPaccount::read()
384{ 385{
385 KConfig *conf = new KConfig( getFileName() ); 386 KConfig *conf = new KConfig( getFileName() );
386 conf->setGroup( "SMTP Account" ); 387 conf->setGroup( "SMTP Account" );
387 accountName = conf->readEntry( "Account" ); 388 accountName = conf->readEntry( "Account" );
388 server = conf->readEntry( "Server" ); 389 server = conf->readEntry( "Server" );
389 port = conf->readEntry( "Port" ); 390 port = conf->readEntry( "Port" );
390 ssl = conf->readBoolEntry( "SSL" ); 391 ssl = conf->readBoolEntry( "SSL" );
391 connectionType = conf->readNumEntry( "ConnectionType" ); 392 connectionType = conf->readNumEntry( "ConnectionType" );
392 login = conf->readBoolEntry( "Login" ); 393 login = conf->readBoolEntry( "Login" );
393 user = conf->readEntry( "User" ); 394 user = conf->readEntry( "User" );
394 //password = conf->readEntryCrypt( "Password" ); 395 //password = conf->readEntryCrypt( "Password" );
395 setPasswordList( conf->readListEntry( "FolderHistory")); 396 setPasswordList( conf->readListEntry( "FolderHistory"));
396 delete conf; 397 delete conf;
397} 398}
398 399
399void SMTPaccount::save() 400void SMTPaccount::save()
400{ 401{
401 Settings::checkDirectory(); 402 Settings::checkDirectory();
402 403
403 KConfig *conf = new KConfig( getFileName() ); 404 KConfig *conf = new KConfig( getFileName() );
404 conf->setGroup( "SMTP Account" ); 405 conf->setGroup( "SMTP Account" );
405 conf->writeEntry( "Account", accountName ); 406 conf->writeEntry( "Account", accountName );
406 conf->writeEntry( "Server", server ); 407 conf->writeEntry( "Server", server );
407 conf->writeEntry( "Port", port ); 408 conf->writeEntry( "Port", port );
diff --git a/kmicromail/opiemail.cpp b/kmicromail/opiemail.cpp
index 8d16ae7..af5376f 100644
--- a/kmicromail/opiemail.cpp
+++ b/kmicromail/opiemail.cpp
@@ -1,535 +1,542 @@
1// CHANGED 2004-09-31 Lutz Rogowski 1// CHANGED 2004-09-31 Lutz Rogowski
2// CHANGED 2004-08-06 Lutz Rogowski 2// CHANGED 2004-08-06 Lutz Rogowski
3 3
4#include "koprefsdialog.h" 4#include "koprefsdialog.h"
5#include <kapplication.h> 5#include <kapplication.h>
6#include <libkdepim/externalapphandler.h> 6#include <libkdepim/externalapphandler.h>
7#include <libkdepim/kpimglobalprefs.h> 7#include <libkdepim/kpimglobalprefs.h>
8#ifdef MINIKDE_KDIALOG_H 8#ifdef MINIKDE_KDIALOG_H
9#undef MINIKDE_KDIALOG_H 9#undef MINIKDE_KDIALOG_H
10#endif 10#endif
11#include "settingsdialog.h" 11#include "settingsdialog.h"
12#include "opiemail.h" 12#include "opiemail.h"
13#include "editaccounts.h" 13#include "editaccounts.h"
14#include "composemail.h" 14#include "composemail.h"
15#include "mailistviewitem.h" 15#include "mailistviewitem.h"
16#include "viewmail.h" 16#include "viewmail.h"
17#include "selectstore.h" 17#include "selectstore.h"
18#include "selectsmtp.h" 18#include "selectsmtp.h"
19#include "accountitem.h" 19#include "accountitem.h"
20#include "klocale.h" 20#include "klocale.h"
21 21
22#include <qmessagebox.h> 22#include <qmessagebox.h>
23#include <qtimer.h> 23#include <qtimer.h>
24#include <qcursor.h> 24#include <qcursor.h>
25#include <qregexp.h> 25#include <qregexp.h>
26#include <qpe/global.h>
26 27
27#ifdef DESKTOP_VERSION 28#ifdef DESKTOP_VERSION
28#include <qapplication.h> 29#include <qapplication.h>
29#else 30#else
30#include <qpe/qpeapplication.h> 31#include <qpe/qpeapplication.h>
31#endif 32#endif
32#include <libmailwrapper/smtpwrapper.h> 33#include <libmailwrapper/smtpwrapper.h>
33#include <libmailwrapper/mailtypes.h> 34#include <libmailwrapper/mailtypes.h>
34#include <libmailwrapper/abstractmail.h> 35#include <libmailwrapper/abstractmail.h>
35 36
36//using namespace Opie::Core; 37//using namespace Opie::Core;
37 38
38OpieMail::OpieMail( QWidget *parent, const char *name ) 39OpieMail::OpieMail( QWidget *parent, const char *name )
39 : MainWindow( parent, name) //, WStyle_ContextHelp ) 40 : MainWindow( parent, name) //, WStyle_ContextHelp )
40{ 41{
41 settings = new Settings(); 42 settings = new Settings();
42 43
43 setIcon(SmallIcon( "kmicromail" ) ); 44 setIcon(SmallIcon( "kmicromail" ) );
44 folderView->populate( settings->getAccounts() ); 45 folderView->populate( settings->getAccounts() );
45 46
46} 47}
47 48
48OpieMail::~OpieMail() 49OpieMail::~OpieMail()
49{ 50{
50 if (settings) delete settings; 51 if (settings) delete settings;
51} 52}
52 53
53void OpieMail::appMessage(const QCString &msg, const QByteArray &data) 54void OpieMail::appMessage(const QCString &msg, const QByteArray &data)
54{ 55{
55 56
56} 57}
57#include <stdlib.h> 58#include <stdlib.h>
58void OpieMail::message(const QCString &msg, const QByteArray &data) 59void OpieMail::message(const QCString &msg, const QByteArray &data)
59{ 60{
60 // copied from old mail2 61 // copied from old mail2
61 static int ii = 0; 62 static int ii = 0;
62 //qDebug("QCOP CALL ############################# %d ", ii); 63 //qDebug("QCOP CALL ############################# %d ", ii);
63 //QString mess ( msg ); 64 //QString mess ( msg );
64 //qDebug("Message = %s ",mess.latin1()); 65 //qDebug("Message = %s ",mess.latin1());
65 ++ii; 66 ++ii;
66 //qDebug("KM:appMessage %d *%s* %x", ii, msg.data(), this); 67 //qDebug("KM:appMessage %d *%s* %x", ii, msg.data(), this);
67 68
68 mPendingEmail = QString::null; 69 mPendingEmail = QString::null;
69 mPendingName = QString::null; 70 mPendingName = QString::null;
70 if (msg == "writeMail(QString,QString)") 71 if (msg == "writeMail(QString,QString)")
71 { 72 {
72 //qDebug("writeMail(QString,QString) "); 73 //qDebug("writeMail(QString,QString) ");
73 QDataStream stream(data,IO_ReadOnly); 74 QDataStream stream(data,IO_ReadOnly);
74 stream >> mPendingName >> mPendingEmail; 75 stream >> mPendingName >> mPendingEmail;
75 // removing the whitespaces at beginning and end is needed! 76 // removing the whitespaces at beginning and end is needed!
76 QTimer::singleShot ( 50, this, SLOT(slotComposeMail() ) ); 77 QTimer::singleShot ( 50, this, SLOT(slotComposeMail() ) );
77 } 78 }
78 else if (msg == "newMail()") 79 else if (msg == "newMail()")
79 { 80 {
80 //qDebug("slotComposeMail() "); 81 //qDebug("slotComposeMail() ");
81 // we cannot call slotComposeMail(); directly, because may be executing a QCOP call 82 // we cannot call slotComposeMail(); directly, because may be executing a QCOP call
82 // and a QCOP call does not like a processevents in his execution 83 // and a QCOP call does not like a processevents in his execution
83 // with the Qtimer we call slotComposeMail() after we reached the main event loop 84 // with the Qtimer we call slotComposeMail() after we reached the main event loop
84 QTimer::singleShot ( 50, this, SLOT(slotComposeMail() ) ); 85 QTimer::singleShot ( 50, this, SLOT(slotComposeMail() ) );
85 // slotComposeMail(); 86 // slotComposeMail();
86 } 87 }
87 else if (msg == "newMail(QString)") 88 else if (msg == "newMail(QString)")
88 { 89 {
89 //qDebug(" newMail(QString)"); 90 //qDebug(" newMail(QString)");
90 QDataStream stream(data,IO_ReadOnly); 91 QDataStream stream(data,IO_ReadOnly);
91 stream >> mPendingName; 92 stream >> mPendingName;
92 // the format is 93 // the format is
93 // NAME <EMAIL>:SUBJECT 94 // NAME <EMAIL>:SUBJECT
94 QTimer::singleShot ( 50, this, SLOT(slotComposeMail() ) ); 95 QTimer::singleShot ( 50, this, SLOT(slotComposeMail() ) );
95 } else { 96 } else {
96 mPendingData = data; 97 mPendingData = data;
97 mPendingMessage = msg; 98 mPendingMessage = msg;
98 QTimer::singleShot ( 50, this, SLOT(slotExtAppHandler() ) ); 99 QTimer::singleShot ( 50, this, SLOT(slotExtAppHandler() ) );
99 } 100 }
100 101
101 //qDebug("END OpieMail::message "); 102 //qDebug("END OpieMail::message ");
102} 103}
103void OpieMail::slotExtAppHandler() 104void OpieMail::slotExtAppHandler()
104{ 105{
105 ExternalAppHandler::instance()->appMessage ( mPendingMessage, mPendingData ); 106 ExternalAppHandler::instance()->appMessage ( mPendingMessage, mPendingData );
106} 107}
107void OpieMail::slotwriteMail2(const QString& namemail ) 108void OpieMail::slotwriteMail2(const QString& namemail )
108{ 109{
109 //qDebug("OpieMail::slotwriteMail2 "); 110 //qDebug("OpieMail::slotwriteMail2 ");
110 //qApp->processEvents(); 111 //qApp->processEvents();
111 ComposeMail compose( settings, this, 0, true ); 112 ComposeMail compose( settings, this, 0, true );
112 if ( !namemail.isEmpty() ) { 113 if ( !namemail.isEmpty() ) {
113 QString to = namemail; 114 QString to = namemail;
114 if ( namemail.find( " <") > 1 ) { 115 if ( namemail.find( " <") > 1 ) {
115 to = "\"" +to.replace( QRegExp( " <"), "\" <") ; 116 to = "\"" +to.replace( QRegExp( " <"), "\" <") ;
116 } else 117 } else
117 if ( namemail.find( "<") > 1 ) { 118 if ( namemail.find( "<") > 1 ) {
118 to = "\"" +to.replace( QRegExp( "<"), "\" <") ; 119 to = "\"" +to.replace( QRegExp( "<"), "\" <") ;
119 } 120 }
120 int sub = to.find( ">:"); 121 int sub = to.find( ">:");
121 if ( sub > 0 ) { 122 if ( sub > 0 ) {
122 compose.setTo( to.left(sub+1) ); 123 compose.setTo( to.left(sub+1) );
123 compose.setSubject( to.mid(sub+2) ); 124 compose.setSubject( to.mid(sub+2) );
124 } else 125 } else
125 compose.setTo( to ); 126 compose.setTo( to );
126 } 127 }
127 compose.slotAdjustColumns(); 128 compose.slotAdjustColumns();
128#ifndef DESKTOP_VERSION 129#ifndef DESKTOP_VERSION
129 compose.showMaximized(); 130 compose.showMaximized();
130#endif 131#endif
131 compose.exec(); 132 compose.exec();
132 raise(); 133 raise();
133 //qDebug("retttich "); 134 //qDebug("retttich ");
134} 135}
135void OpieMail::slotwriteMail(const QString&name,const QString&email) 136void OpieMail::slotwriteMail(const QString&name,const QString&email)
136{ 137{
137 // qDebug("OpieMail::slotwriteMail "); 138 // qDebug("OpieMail::slotwriteMail ");
138 ComposeMail compose( settings, this, 0, true ); 139 ComposeMail compose( settings, this, 0, true );
139 if (!email.isEmpty()) 140 if (!email.isEmpty())
140 { 141 {
141 if (!name.isEmpty()) 142 if (!name.isEmpty())
142 { 143 {
143 compose.setTo("\"" + name + "\"" + " " + "<"+ email + ">"); 144 compose.setTo("\"" + name + "\"" + " " + "<"+ email + ">");
144 } 145 }
145 else 146 else
146 { 147 {
147 compose.setTo(email); 148 compose.setTo(email);
148 } 149 }
149 } 150 }
150 compose.slotAdjustColumns(); 151 compose.slotAdjustColumns();
151#ifndef DESKTOP_VERSION 152#ifndef DESKTOP_VERSION
152 compose.showMaximized(); 153 compose.showMaximized();
153#endif 154#endif
154 compose.exec(); 155 compose.exec();
155 raise(); 156 raise();
156} 157}
157 158
158void OpieMail::slotComposeMail() 159void OpieMail::slotComposeMail()
159{ 160{
160 if ( mPendingEmail == QString::null && mPendingName == QString::null) 161 if ( mPendingEmail == QString::null && mPendingName == QString::null)
161 slotwriteMail2( QString () ); 162 slotwriteMail2( QString () );
162 else { 163 else {
163 if ( mPendingEmail == QString::null ) 164 if ( mPendingEmail == QString::null )
164 slotwriteMail2( mPendingName ); 165 slotwriteMail2( mPendingName );
165 else 166 else
166 slotwriteMail( mPendingName, mPendingEmail ); 167 slotwriteMail( mPendingName, mPendingEmail );
167 } 168 }
168 //slotwriteMail(0l,0l); 169 //slotwriteMail(0l,0l);
169} 170}
170 171
171void OpieMail::slotSendQueued() 172void OpieMail::slotSendQueued()
172{ 173{
173 SMTPaccount *smtp = 0; 174 SMTPaccount *smtp = 0;
174 175
175 QList<Account> list = settings->getAccounts(); 176 QList<Account> list = settings->getAccounts();
176 QList<SMTPaccount> smtpList; 177 QList<SMTPaccount> smtpList;
177 smtpList.setAutoDelete(false); 178 smtpList.setAutoDelete(false);
178 Account *it; 179 Account *it;
179 for ( it = list.first(); it; it = list.next() ) 180 for ( it = list.first(); it; it = list.next() )
180 { 181 {
181 if ( it->getType() == MAILLIB::A_SMTP ) 182 if ( it->getType() == MAILLIB::A_SMTP )
182 { 183 {
183 smtp = static_cast<SMTPaccount *>(it); 184 smtp = static_cast<SMTPaccount *>(it);
184 smtpList.append(smtp); 185 smtpList.append(smtp);
185 } 186 }
186 } 187 }
187 if (smtpList.count()==0) 188 if (smtpList.count()==0)
188 { 189 {
189 QMessageBox::information(0,i18n("Info"),i18n("Define a smtp account first!\n")); 190 QMessageBox::information(0,i18n("Info"),i18n("Define a smtp account first!\n"));
190 return; 191 return;
191 } 192 }
193 if ( QMessageBox::warning(this, i18n("Sending all mails"), i18n("Do you really want to send\nall queued mails?" ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::No )
194 return;
192 if (smtpList.count()==1) 195 if (smtpList.count()==1)
193 { 196 {
194 smtp = smtpList.at(0); 197 smtp = smtpList.at(0);
195 } 198 }
196 else 199 else
197 { 200 {
198 smtp = 0; 201 smtp = 0;
199 selectsmtp selsmtp; 202 selectsmtp selsmtp;
200 selsmtp.setSelectionlist(&smtpList); 203 selsmtp.setSelectionlist(&smtpList);
201#ifndef DESKTOP_VERSION 204#ifndef DESKTOP_VERSION
202 selsmtp.showMaximized(); 205 selsmtp.showMaximized();
203#endif 206#endif
204 if ( selsmtp.exec() == QDialog::Accepted ) 207 if ( selsmtp.exec() == QDialog::Accepted )
205 { 208 {
206 smtp = selsmtp.selected_smtp(); 209 smtp = selsmtp.selected_smtp();
207 } 210 }
208 } 211 }
209 if (smtp) 212 if (smtp)
210 { 213 {
214
215 Global::statusMessage("Sending mails...!");
211 SMTPwrapper * wrap = new SMTPwrapper(smtp); 216 SMTPwrapper * wrap = new SMTPwrapper(smtp);
212 if ( wrap->flushOutbox() ) 217 if ( wrap->flushOutbox() )
213 { 218 {
214 QMessageBox::information(0,i18n("Info"),i18n("Mail queue flushed")); 219 Global::statusMessage("Mails sent!");
215 } 220 }
216 delete wrap; 221 delete wrap;
217 } 222 }
223 // pending refresh list view, if outgoing is displayed
218} 224}
219 225
220void OpieMail::slotSearchMails() 226void OpieMail::slotSearchMails()
221{ 227{
222 qDebug("OpieMail::slotSearchMails():not implemented "); 228 qDebug("OpieMail::slotSearchMails():not implemented ");
223} 229}
224 230
225void OpieMail::slotEditSettings() 231void OpieMail::slotEditSettings()
226{ 232{
227 233
228 KOPrefsDialog settingsDialog( this, "koprefs", true ); 234 KOPrefsDialog settingsDialog( this, "koprefs", true );
229#ifndef DESKTOP_VERSION 235#ifndef DESKTOP_VERSION
230 settingsDialog.showMaximized(); 236 settingsDialog.showMaximized();
231#endif 237#endif
232 settingsDialog.exec(); 238 settingsDialog.exec();
233 239
234 // KApplication::execDialog(settingsDialog); 240 // KApplication::execDialog(settingsDialog);
235} 241}
236 242
237void OpieMail::slotEditAccounts() 243void OpieMail::slotEditAccounts()
238{ 244{
239 EditAccounts eaDialog( settings, this, 0, true ); 245 EditAccounts eaDialog( settings, this, 0, true );
240 eaDialog.slotAdjustColumns(); 246 eaDialog.slotAdjustColumns();
241#ifndef DESKTOP_VERSION 247#ifndef DESKTOP_VERSION
242 eaDialog.showMaximized(); 248 eaDialog.showMaximized();
243#endif 249#endif
244 eaDialog.exec(); 250 eaDialog.exec();
245 if ( settings ) delete settings; 251 if ( settings ) delete settings;
246 settings = new Settings(); 252 settings = new Settings();
247 253
248 folderView->populate( settings->getAccounts() ); 254 folderView->populate( settings->getAccounts() );
249} 255}
250void OpieMail::replyMail() 256void OpieMail::replyMail()
251{ 257{
252 258
253 QListViewItem*item = mailView->currentItem(); 259 QListViewItem*item = mailView->currentItem();
254 if (!item) return; 260 if (!item) return;
255 RecMailP mail = ((MailListViewItem*)item)->data(); 261 RecMailP mail = ((MailListViewItem*)item)->data();
256 RecBodyP body = folderView->fetchBody(mail); 262 RecBodyP body = folderView->fetchBody(mail);
257 263
258 QString rtext; 264 QString rtext;
259 rtext += QString("* %1 wrote on %2:\n") // no i18n on purpose 265 rtext += QString("* %1 wrote on %2:\n") // no i18n on purpose
260 .arg( QString::fromUtf8( mail->getFrom().latin1())) 266 .arg( QString::fromUtf8( mail->getFrom().latin1()))
261 .arg( QString::fromUtf8( mail->getDate().latin1() )); 267 .arg( QString::fromUtf8( mail->getDate().latin1() ));
262 268
263 QString text = QString::fromUtf8( body->Bodytext().latin1() ); 269 QString text = QString::fromUtf8( body->Bodytext().latin1() );
264 QStringList lines = QStringList::split(QRegExp("\\n"), text); 270 QStringList lines = QStringList::split(QRegExp("\\n"), text);
265 QStringList::Iterator it; 271 QStringList::Iterator it;
266 for (it = lines.begin(); it != lines.end(); it++) 272 for (it = lines.begin(); it != lines.end(); it++)
267 { 273 {
268 rtext += "> " + *it + "\n"; 274 rtext += "> " + *it + "\n";
269 } 275 }
270 rtext += "\n"; 276 rtext += "\n";
271 277
272 QString prefix; 278 QString prefix;
273 if ( mail->getSubject().find(QRegExp("^Re: .*$")) != -1) prefix = ""; 279 if ( mail->getSubject().find(QRegExp("^Re: .*$")) != -1) prefix = "";
274 else prefix = "Re: "; // no i18n on purpose 280 else prefix = "Re: "; // no i18n on purpose
275 281
276 Settings *settings = new Settings(); 282 Settings *settings = new Settings();
277 ComposeMail composer( settings ,this, 0, true); 283 ComposeMail composer( settings ,this, 0, true);
278 if (mail->Replyto().isEmpty()) { 284 if (mail->Replyto().isEmpty()) {
279 composer.setTo( QString::fromUtf8( mail->getFrom().latin1())); 285 composer.setTo( QString::fromUtf8( mail->getFrom().latin1()));
280 } else { 286 } else {
281 composer.setTo( QString::fromUtf8(mail->Replyto().latin1())); 287 composer.setTo( QString::fromUtf8(mail->Replyto().latin1()));
282 } 288 }
283 composer.setSubject( prefix + QString::fromUtf8( mail->getSubject().latin1() ) ); 289 composer.setSubject( prefix + QString::fromUtf8( mail->getSubject().latin1() ) );
284 composer.setMessage( rtext ); 290 composer.setMessage( rtext );
285 composer.setInReplyTo( QString::fromUtf8(mail->Msgid().latin1())); 291 composer.setInReplyTo( QString::fromUtf8(mail->Msgid().latin1()));
286 292
287 if ( QDialog::Accepted == KApplication::execDialog( &composer ) ) 293 if ( QDialog::Accepted == KApplication::execDialog( &composer ) )
288 { 294 {
289 mail->Wrapper()->answeredMail(mail); 295 mail->Wrapper()->answeredMail(mail);
290 } 296 }
291 delete settings; 297 delete settings;
292 298
293} 299}
294void OpieMail::displayMail() 300void OpieMail::displayMail()
295{ 301{
296 QListViewItem*item = mailView->currentItem(); 302 QListViewItem*item = mailView->currentItem();
297 if (!item) return; 303 if (!item) return;
298 RecMailP mail = ((MailListViewItem*)item)->data(); 304 RecMailP mail = ((MailListViewItem*)item)->data();
299 RecBodyP body = folderView->fetchBody(mail); 305 RecBodyP body = folderView->fetchBody(mail);
300 ViewMail readMail( this,"", Qt::WType_Modal ); 306 ViewMail readMail( this,"", Qt::WType_Modal );
301 readMail.setBody( body ); 307 readMail.setBody( body );
302 readMail.setMail( mail ); 308 readMail.setMail( mail );
303#ifndef DESKTOP_VERSION 309#ifndef DESKTOP_VERSION
304 readMail.showMaximized(); 310 readMail.showMaximized();
305#else 311#else
306 readMail.resize( 640, 480); 312 readMail.resize( 640, 480);
307#endif 313#endif
308 readMail.exec(); 314 readMail.exec();
309 315
310 if ( readMail.deleted ) 316 if ( readMail.deleted )
311 { 317 {
312 folderView->refreshCurrent(); 318 folderView->refreshCurrent();
313 } 319 }
314 else 320 else
315 { 321 {
316 ( (MailListViewItem*)item )->setPixmap( 0, QPixmap() ); 322 ( (MailListViewItem*)item )->setPixmap( 0, QPixmap() );
317 } 323 }
318} 324}
319void OpieMail::slotGetAllMail() 325void OpieMail::slotGetAllMail()
320{ 326{
321 QListViewItem * item = folderView->firstChild(); 327 QListViewItem * item = folderView->firstChild();
322 while ( item ){ 328 while ( item ){
323 ((AccountViewItem *)item)->contextMenuSelected( 101 ); 329 ((AccountViewItem *)item)->contextMenuSelected( 101 );
324 item = item->nextSibling (); 330 item = item->nextSibling ();
325 } 331 }
326} 332}
327void OpieMail::slotGetMail() 333void OpieMail::slotGetMail()
328{ 334{
329 QListViewItem * item = folderView->currentItem(); 335 QListViewItem * item = folderView->currentItem();
330 if ( ! item ) return; 336 if ( ! item ) return;
331 ((AccountViewItem *)item)->contextMenuSelected( 101 ); 337 ((AccountViewItem *)item)->contextMenuSelected( 101 );
332} 338}
333void OpieMail::slotDeleteMail() 339void OpieMail::slotDeleteMail()
334{ 340{
335 if (!mailView->currentItem()) return; 341 if (!mailView->currentItem()) return;
336 RecMailP mail = ((MailListViewItem*)mailView->currentItem() )->data(); 342 RecMailP mail = ((MailListViewItem*)mailView->currentItem() )->data();
337 if ( QMessageBox::warning(this, i18n("Delete Mail"), QString( i18n("<p>Do you really want to delete this mail? <br><br>" ) + mail->getFrom() + " - " + mail->getSubject() ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) 343 if ( QMessageBox::warning(this, i18n("Delete Mail"), QString( i18n("<p>Do you really want to delete this mail? <br><br>" ) + mail->getFrom() + " - " + mail->getSubject() ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes )
338 { 344 {
339 mail->Wrapper()->deleteMail( mail ); 345 mail->Wrapper()->deleteMail( mail );
340 folderView->refreshCurrent(); 346 folderView->refreshCurrent();
341 } 347 }
342} 348}
343void OpieMail::slotDeleteAllMail() 349void OpieMail::slotDeleteAllMail()
344{ 350{
345 351
346 QValueList<RecMailP> t; 352 QValueList<RecMailP> t;
347 if ( QMessageBox::warning(this, i18n("Delete All Mails"), i18n("Do you really want to delete\nall selected mails?" ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) 353 if ( QMessageBox::warning(this, i18n("Delete All Mails"), i18n("Do you really want to delete\nall selected mails?" ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes )
348 { 354 {
349 MailListViewItem* item = (MailListViewItem*)mailView->firstChild (); 355 MailListViewItem* item = (MailListViewItem*)mailView->firstChild ();
350 while ( item ) { 356 while ( item ) {
351 if ( item->isSelected() ) { 357 if ( item->isSelected() ) {
352 t.append( item->data() ); 358 t.append( item->data() );
353 } 359 }
354 item = (MailListViewItem*)item->nextSibling(); 360 item = (MailListViewItem*)item->nextSibling();
355 } 361 }
356 } 362 }
357 else 363 else
358 return; 364 return;
359 if ( t.count() == 0 ) 365 if ( t.count() == 0 )
360 return; 366 return;
361 RecMailP mail = t.first(); 367 RecMailP mail = t.first();
362 mail->Wrapper()->deleteMailList(t); 368 mail->Wrapper()->deleteMailList(t);
363 folderView->refreshCurrent(); 369 folderView->refreshCurrent();
364 370
365 371
366} 372}
367void OpieMail::clearSelection() 373void OpieMail::clearSelection()
368{ 374{
369 mailView->clearSelection(); 375 mailView->clearSelection();
370 376
371} 377}
372 378
373void OpieMail::mailHold(int button, QListViewItem *item,const QPoint&,int ) 379void OpieMail::mailHold(int button, QListViewItem *item,const QPoint&,int )
374{ 380{
375 if (!mailView->currentItem()) return; 381 if (!mailView->currentItem()) return;
376 MAILLIB::ATYPE mailtype = ((MailListViewItem*)mailView->currentItem() )->wrapperType(); 382 MAILLIB::ATYPE mailtype = ((MailListViewItem*)mailView->currentItem() )->wrapperType();
377 /* just the RIGHT button - or hold on pda */ 383 /* just the RIGHT button - or hold on pda */
378 if (button!=2) {return;} 384 if (button!=2) {return;}
379 if (!item) return; 385 if (!item) return;
380 QPopupMenu *m = new QPopupMenu(0); 386 QPopupMenu *m = new QPopupMenu(0);
381 if (m) 387 if (m)
382 { 388 {
383 if (mailtype==MAILLIB::A_NNTP) { 389 if (mailtype==MAILLIB::A_NNTP) {
384 m->insertItem(i18n("Read this posting"),this,SLOT(displayMail())); 390 m->insertItem(i18n("Read this posting"),this,SLOT(displayMail()));
385 m->insertItem(i18n("Copy this posting"),this,SLOT(slotMoveCopyMail())); 391 m->insertItem(i18n("Copy this posting"),this,SLOT(slotMoveCopyMail()));
386 m->insertSeparator(); 392 m->insertSeparator();
387 m->insertItem(i18n("Copy all selected postings"),this,SLOT(slotMoveCopyAllMail())); 393 m->insertItem(i18n("Copy all selected postings"),this,SLOT(slotMoveCopyAllMail()));
388 m->insertItem(i18n("Clear selection"),this,SLOT(clearSelection())); 394 m->insertItem(i18n("Clear selection"),this,SLOT(clearSelection()));
389 } else { 395 } else {
390 if (folderView->currentisDraft()) { 396 if (folderView->currentisDraft()) {
391 m->insertItem(i18n("Edit this mail"),this,SLOT(reEditMail())); 397 m->insertItem(i18n("Edit this mail"),this,SLOT(reEditMail()));
392 } 398 }
393 m->insertItem(i18n("Reply to this mail"),this,SLOT(replyMail())); 399 m->insertItem(i18n("Reply to this mail"),this,SLOT(replyMail()));
394 m->insertSeparator(); 400 m->insertSeparator();
395 m->insertItem(i18n("Read this mail"),this,SLOT(displayMail())); 401 m->insertItem(i18n("Read this mail"),this,SLOT(displayMail()));
396 m->insertItem(i18n("Move/Copy this mail"),this,SLOT(slotMoveCopyMail())); 402 m->insertItem(i18n("Move/Copy this mail"),this,SLOT(slotMoveCopyMail()));
397 m->insertItem(i18n("Delete this mail"),this,SLOT(slotDeleteMail())); 403 m->insertItem(i18n("Delete this mail"),this,SLOT(slotDeleteMail()));
398 m->insertSeparator(); 404 m->insertSeparator();
399 m->insertItem(i18n("Move/Copy all selected mail"),this,SLOT(slotMoveCopyAllMail())); 405 m->insertItem(i18n("Move/Copy all selected mail"),this,SLOT(slotMoveCopyAllMail()));
400 m->insertItem(i18n("Delete all selected mails"),this,SLOT(slotDeleteAllMail())); 406 m->insertItem(i18n("Delete all selected mails"),this,SLOT(slotDeleteAllMail()));
401 m->insertItem(i18n("Clear selection"),this,SLOT(clearSelection())); 407 m->insertItem(i18n("Clear selection"),this,SLOT(clearSelection()));
402 } 408 }
403 m->setFocus(); 409 m->setFocus();
404 m->exec( QPoint( QCursor::pos().x(), QCursor::pos().y()) ); 410 m->exec( QPoint( QCursor::pos().x(), QCursor::pos().y()) );
405 delete m; 411 delete m;
406 } 412 }
407} 413}
408 414
409void OpieMail::slotShowFolders( bool show ) 415void OpieMail::slotShowFolders( bool show )
410{ 416{
411 if ( show && folderView->isHidden() ) 417 if ( show && folderView->isHidden() )
412 { 418 {
413 folderView->show(); 419 folderView->show();
414 } 420 }
415 else if ( !show && !folderView->isHidden() ) 421 else if ( !show && !folderView->isHidden() )
416 { 422 {
417 folderView->hide(); 423 folderView->hide();
418 } 424 }
419} 425}
420 426
421void OpieMail::refreshMailView(const QValueList<RecMailP>&list) 427void OpieMail::refreshMailView(const QValueList<RecMailP>&list)
422{ 428{
423 MailListViewItem*item = 0; 429 MailListViewItem*item = 0;
424 mailView->clear(); 430 mailView->clear();
425 431
426 QValueList<RecMailP>::ConstIterator it; 432 QValueList<RecMailP>::ConstIterator it;
427 for (it = list.begin(); it != list.end();++it) 433 for (it = list.begin(); it != list.end();++it)
428 { 434 {
429 item = new MailListViewItem(mailView,item); 435 item = new MailListViewItem(mailView,item);
430 item->storeData((*it)); 436 item->storeData((*it));
431 item->showEntry(); 437 item->showEntry();
432 } 438 }
439 mailView->setSorting ( 4, false );
433} 440}
434 441
435void OpieMail::mailLeftClicked( QListViewItem *item ) 442void OpieMail::mailLeftClicked( QListViewItem *item )
436{ 443{
437 mailView->clearSelection(); 444 mailView->clearSelection();
438 /* just LEFT button - or tap with stylus on pda */ 445 /* just LEFT button - or tap with stylus on pda */
439 //if (button!=1) return; 446 //if (button!=1) return;
440 if (!item) return; 447 if (!item) return;
441 if (folderView->currentisDraft()) { 448 if (folderView->currentisDraft()) {
442 reEditMail(); 449 reEditMail();
443 } else { 450 } else {
444 displayMail(); 451 displayMail();
445 } 452 }
446} 453}
447 454
448void OpieMail::slotMoveCopyMail() 455void OpieMail::slotMoveCopyMail()
449{ 456{
450 if (!mailView->currentItem()) return; 457 if (!mailView->currentItem()) return;
451 RecMailP mail = ((MailListViewItem*)mailView->currentItem() )->data(); 458 RecMailP mail = ((MailListViewItem*)mailView->currentItem() )->data();
452 AbstractMail*targetMail = 0; 459 AbstractMail*targetMail = 0;
453 QString targetFolder = ""; 460 QString targetFolder = "";
454 Selectstore sels; 461 Selectstore sels;
455 folderView->setupFolderselect(&sels); 462 folderView->setupFolderselect(&sels);
456 if (!sels.exec()) return; 463 if (!sels.exec()) return;
457 targetMail = sels.currentMail(); 464 targetMail = sels.currentMail();
458 targetFolder = sels.currentFolder(); 465 targetFolder = sels.currentFolder();
459 if ( (mail->Wrapper()==targetMail && mail->getMbox()==targetFolder) || 466 if ( (mail->Wrapper()==targetMail && mail->getMbox()==targetFolder) ||
460 targetFolder.isEmpty()) 467 targetFolder.isEmpty())
461 { 468 {
462 return; 469 return;
463 } 470 }
464 if (sels.newFolder() && !targetMail->createMbox(targetFolder)) 471 if (sels.newFolder() && !targetMail->createMbox(targetFolder))
465 { 472 {
466 QMessageBox::critical(0,i18n("Error creating new Folder"), 473 QMessageBox::critical(0,i18n("Error creating new Folder"),
467 i18n("<center>Error while creating<br>new folder - breaking.</center>")); 474 i18n("<center>Error while creating<br>new folder - breaking.</center>"));
468 return; 475 return;
469 } 476 }
470 sels.hide(); 477 sels.hide();
471 qApp->processEvents(); 478 qApp->processEvents();
472 // qDebug("hiding sels "); 479 // qDebug("hiding sels ");
473 mail->Wrapper()->mvcpMail(mail,targetFolder,targetMail,sels.moveMails()); 480 mail->Wrapper()->mvcpMail(mail,targetFolder,targetMail,sels.moveMails());
474 folderView->refreshCurrent(); 481 folderView->refreshCurrent();
475} 482}
476 483
477void OpieMail::slotMoveCopyAllMail() 484void OpieMail::slotMoveCopyAllMail()
478{ 485{
479 486
480 if (!mailView->currentItem()) return; 487 if (!mailView->currentItem()) return;
481 QValueList<RecMailP> t; 488 QValueList<RecMailP> t;
482 // if ( QMessageBox::warning(this, i18n("Move/Copy all selected mails"), i18n("Do you really want to copy/move\nall selected mails?" ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) 489 // if ( QMessageBox::warning(this, i18n("Move/Copy all selected mails"), i18n("Do you really want to copy/move\nall selected mails?" ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes )
483 { 490 {
484 MailListViewItem* item = (MailListViewItem*)mailView->firstChild (); 491 MailListViewItem* item = (MailListViewItem*)mailView->firstChild ();
485 while ( item ) { 492 while ( item ) {
486 if ( item->isSelected() ) { 493 if ( item->isSelected() ) {
487 t.append( item->data() ); 494 t.append( item->data() );
488 } 495 }
489 item = (MailListViewItem*)item->nextSibling(); 496 item = (MailListViewItem*)item->nextSibling();
490 } 497 }
491 } 498 }
492 // else 499 // else
493 // return; 500 // return;
494 if ( t.count() == 0 ) 501 if ( t.count() == 0 )
495 return; 502 return;
496 RecMailP mail = t.first(); 503 RecMailP mail = t.first();
497 AbstractMail*targetMail = 0; 504 AbstractMail*targetMail = 0;
498 QString targetFolder = ""; 505 QString targetFolder = "";
499 Selectstore sels; 506 Selectstore sels;
500 folderView->setupFolderselect(&sels); 507 folderView->setupFolderselect(&sels);
501 if (!sels.exec()) return; 508 if (!sels.exec()) return;
502 targetMail = sels.currentMail(); 509 targetMail = sels.currentMail();
503 targetFolder = sels.currentFolder(); 510 targetFolder = sels.currentFolder();
504 if ( (mail->Wrapper()==targetMail && mail->getMbox()==targetFolder) || 511 if ( (mail->Wrapper()==targetMail && mail->getMbox()==targetFolder) ||
505 targetFolder.isEmpty()) 512 targetFolder.isEmpty())
506 { 513 {
507 return; 514 return;
508 } 515 }
509 if (sels.newFolder() && !targetMail->createMbox(targetFolder)) 516 if (sels.newFolder() && !targetMail->createMbox(targetFolder))
510 { 517 {
511 QMessageBox::critical(0,i18n("Error creating new Folder"), 518 QMessageBox::critical(0,i18n("Error creating new Folder"),
512 i18n("<center>Error while creating<br>new folder - breaking.</center>")); 519 i18n("<center>Error while creating<br>new folder - breaking.</center>"));
513 return; 520 return;
514 } 521 }
515 sels.hide(); 522 sels.hide();
516 qApp->processEvents(); 523 qApp->processEvents();
517 //qDebug("hiding sels "); 524 //qDebug("hiding sels ");
518 mail->Wrapper()->mvcpMailList(t,targetFolder,targetMail,sels.moveMails()); 525 mail->Wrapper()->mvcpMailList(t,targetFolder,targetMail,sels.moveMails());
519 folderView->refreshCurrent(); 526 folderView->refreshCurrent();
520} 527}
521 528
522void OpieMail::reEditMail() 529void OpieMail::reEditMail()
523{ 530{
524 if (!mailView->currentItem()) return; 531 if (!mailView->currentItem()) return;
525 532
526 ComposeMail compose( settings, this, 0, true ); 533 ComposeMail compose( settings, this, 0, true );
527 compose.reEditMail(((MailListViewItem*)mailView->currentItem() )->data()); 534 compose.reEditMail(((MailListViewItem*)mailView->currentItem() )->data());
528 compose.slotAdjustColumns(); 535 compose.slotAdjustColumns();
529#ifndef DESKTOP_VERSION 536#ifndef DESKTOP_VERSION
530 compose.showMaximized(); 537 compose.showMaximized();
531#else 538#else
532 compose.resize(640,480); 539 compose.resize(640,480);
533#endif 540#endif
534 compose.exec(); 541 compose.exec();
535} 542}
diff --git a/libkdepim/kprefswidget.cpp b/libkdepim/kprefswidget.cpp
index be9ad30..f6a0b38 100644
--- a/libkdepim/kprefswidget.cpp
+++ b/libkdepim/kprefswidget.cpp
@@ -1,427 +1,428 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24// $Id$ 24// $Id$
25 25
26#include <qlayout.h> 26#include <qlayout.h>
27#include <qlabel.h> 27#include <qlabel.h>
28#include <qgroupbox.h> 28#include <qgroupbox.h>
29#include <qbuttongroup.h> 29#include <qbuttongroup.h>
30#include <qlineedit.h> 30#include <qlineedit.h>
31#include <qfont.h> 31#include <qfont.h>
32#include <qslider.h> 32#include <qslider.h>
33#include <qfile.h> 33#include <qfile.h>
34#include <qtextstream.h> 34#include <qtextstream.h>
35#include <qvbox.h> 35#include <qvbox.h>
36#include <qhbox.h> 36#include <qhbox.h>
37#include <qspinbox.h> 37#include <qspinbox.h>
38#include <qdatetime.h> 38#include <qdatetime.h>
39#include <qframe.h> 39#include <qframe.h>
40#include <qcombobox.h> 40#include <qcombobox.h>
41#include <qcheckbox.h> 41#include <qcheckbox.h>
42#include <qradiobutton.h> 42#include <qradiobutton.h>
43#include <qpushbutton.h> 43#include <qpushbutton.h>
44#include <qapplication.h> 44#include <qapplication.h>
45 45
46#include <kcolorbutton.h> 46#include <kcolorbutton.h>
47#include <kdebug.h> 47#include <kdebug.h>
48#include <klocale.h> 48#include <klocale.h>
49#include <kglobal.h> 49#include <kglobal.h>
50#include <kfontdialog.h> 50#include <kfontdialog.h>
51#include <kmessagebox.h> 51#include <kmessagebox.h>
52#include <kcolordialog.h> 52#include <kcolordialog.h>
53#include <kiconloader.h> 53#include <kiconloader.h>
54 54
55#include "kprefs.h" 55#include "kprefs.h"
56 56
57#include "kprefswidget.h" 57#include "kprefswidget.h"
58//#include "kprefsdialog.moc" 58//#include "kprefsdialog.moc"
59 59
60KPrefsWidBool::KPrefsWidBool(const QString &text,bool *reference, 60KPrefsWidBool::KPrefsWidBool(const QString &text,bool *reference,
61 QWidget *parent) 61 QWidget *parent)
62{ 62{
63 mReference = reference; 63 mReference = reference;
64 64
65 mCheck = new QCheckBox(text,parent); 65 mCheck = new QCheckBox(text,parent);
66 66
67 connect( mCheck, SIGNAL( toggled( bool ) ), SIGNAL( modified() ) ); 67 connect( mCheck, SIGNAL( toggled( bool ) ), SIGNAL( modified() ) );
68 68
69} 69}
70 70
71void KPrefsWidBool::readConfig() 71void KPrefsWidBool::readConfig()
72{ 72{
73 mCheck->setChecked(*mReference); 73 mCheck->setChecked(*mReference);
74} 74}
75 75
76void KPrefsWidBool::writeConfig() 76void KPrefsWidBool::writeConfig()
77{ 77{
78 *mReference = mCheck->isChecked(); 78 *mReference = mCheck->isChecked();
79} 79}
80 80
81QCheckBox *KPrefsWidBool::checkBox() 81QCheckBox *KPrefsWidBool::checkBox()
82{ 82{
83 return mCheck; 83 return mCheck;
84} 84}
85 85
86 86
87KPrefsWidColor::KPrefsWidColor(const QString &text,QColor *reference, 87KPrefsWidColor::KPrefsWidColor(const QString &text,QColor *reference,
88 QWidget *parent) 88 QWidget *parent)
89{ 89{
90 mReference = reference; 90 mReference = reference;
91 91
92 mButton = new KColorButton(parent); 92 mButton = new KColorButton(parent);
93 mLabel = new QLabel(mButton, text, parent); 93 mLabel = new QLabel(mButton, text, parent);
94 mButton->setColor( *mReference ); 94 mButton->setColor( *mReference );
95 mButton->setColor( Qt::red ); 95 mButton->setColor( Qt::red );
96 96
97 connect( mButton, SIGNAL( changed(const QColor &)), SIGNAL( modified() ) ); 97 connect( mButton, SIGNAL( changed(const QColor &)), SIGNAL( modified() ) );
98 98
99} 99}
100 100
101KPrefsWidColor::~KPrefsWidColor() 101KPrefsWidColor::~KPrefsWidColor()
102{ 102{
103// kdDebug(5300) << "KPrefsWidColor::~KPrefsWidColor()" << endl; 103// kdDebug(5300) << "KPrefsWidColor::~KPrefsWidColor()" << endl;
104} 104}
105 105
106void KPrefsWidColor::readConfig() 106void KPrefsWidColor::readConfig()
107{ 107{
108 mButton->setColor(*mReference); 108 mButton->setColor(*mReference);
109} 109}
110 110
111void KPrefsWidColor::writeConfig() 111void KPrefsWidColor::writeConfig()
112{ 112{
113 *mReference = mButton->color(); 113 *mReference = mButton->color();
114} 114}
115 115
116QLabel *KPrefsWidColor::label() 116QLabel *KPrefsWidColor::label()
117{ 117{
118 return mLabel; 118 return mLabel;
119} 119}
120 120
121KColorButton *KPrefsWidColor::button() 121KColorButton *KPrefsWidColor::button()
122{ 122{
123 return mButton; 123 return mButton;
124} 124}
125 125
126KPrefsWidFont::KPrefsWidFont(const QString &sampleText,const QString &labelText, 126KPrefsWidFont::KPrefsWidFont(const QString &sampleText,const QString &labelText,
127 QFont *reference,QWidget *parent) 127 QFont *reference,QWidget *parent)
128{ 128{
129 mReference = reference; 129 mReference = reference;
130 130
131 mLabel = new QLabel(labelText, parent); 131 mLabel = new QLabel(labelText, parent);
132 132
133 mPreview = new QLabel(sampleText,parent); 133 mPreview = new QLabel(sampleText,parent);
134 mPreview->setFrameStyle(QFrame::Panel|QFrame::Sunken); 134 mPreview->setFrameStyle(QFrame::Panel|QFrame::Sunken);
135 135
136 mButton = new QPushButton(i18n("Choose..."), parent); 136 mButton = new QPushButton(i18n("Choose..."), parent);
137 connect(mButton,SIGNAL(clicked()),SLOT(selectFont())); 137 connect(mButton,SIGNAL(clicked()),SLOT(selectFont()));
138 mPreview->setMaximumHeight( QApplication::desktop()->height() / 12 ); 138 mPreview->setMaximumHeight( QApplication::desktop()->height() / 12 );
139 mPreview->setMaximumWidth( (QApplication::desktop()->width() / 2)-10 ); 139 mPreview->setMaximumWidth( (QApplication::desktop()->width() / 2)-10 );
140} 140}
141 141
142KPrefsWidFont::~KPrefsWidFont() 142KPrefsWidFont::~KPrefsWidFont()
143{ 143{
144} 144}
145 145
146void KPrefsWidFont::readConfig() 146void KPrefsWidFont::readConfig()
147{ 147{
148 mPreview->setFont(*mReference); 148 mPreview->setFont(*mReference);
149} 149}
150 150
151void KPrefsWidFont::writeConfig() 151void KPrefsWidFont::writeConfig()
152{ 152{
153 *mReference = mPreview->font(); 153 *mReference = mPreview->font();
154} 154}
155 155
156QLabel *KPrefsWidFont::label() 156QLabel *KPrefsWidFont::label()
157{ 157{
158 return mLabel; 158 return mLabel;
159} 159}
160 160
161QLabel *KPrefsWidFont::preview() 161QLabel *KPrefsWidFont::preview()
162{ 162{
163 return mPreview; 163 return mPreview;
164} 164}
165 165
166QPushButton *KPrefsWidFont::button() 166QPushButton *KPrefsWidFont::button()
167{ 167{
168 return mButton; 168 return mButton;
169} 169}
170 170
171void KPrefsWidFont::selectFont() 171void KPrefsWidFont::selectFont()
172{ 172{
173 QFont myFont(mPreview->font()); 173 QFont myFont(mPreview->font());
174 bool ok; 174 bool ok;
175 myFont = KFontDialog::getFont(myFont, ok); 175 myFont = KFontDialog::getFont(myFont, ok);
176 if ( ok ) { 176 if ( ok ) {
177 mPreview->setFont(myFont); 177 mPreview->setFont(myFont);
178 emit modified(); 178 emit modified();
179 } 179 }
180} 180}
181 181
182 182
183KPrefsWidTime::KPrefsWidTime(const QString &text,int *reference, 183KPrefsWidTime::KPrefsWidTime(const QString &text,int *reference,
184 QWidget *parent) 184 QWidget *parent)
185{ 185{
186 mReference = reference; 186 mReference = reference;
187 187
188 mLabel = new QLabel(text,parent); 188 mLabel = new QLabel(text,parent);
189 mSpin = new QSpinBox(0,23,1,parent); 189 mSpin = new QSpinBox(0,23,1,parent);
190 mSpin->setSuffix(":00"); 190 mSpin->setSuffix(":00");
191 connect( mSpin, SIGNAL( valueChanged(int)), SIGNAL( modified() ) ); 191 connect( mSpin, SIGNAL( valueChanged(int)), SIGNAL( modified() ) );
192 192
193} 193}
194 194
195void KPrefsWidTime::readConfig() 195void KPrefsWidTime::readConfig()
196{ 196{
197 mSpin->setValue(*mReference); 197 mSpin->setValue(*mReference);
198} 198}
199 199
200void KPrefsWidTime::writeConfig() 200void KPrefsWidTime::writeConfig()
201{ 201{
202 *mReference = mSpin->value(); 202 *mReference = mSpin->value();
203} 203}
204 204
205QLabel *KPrefsWidTime::label() 205QLabel *KPrefsWidTime::label()
206{ 206{
207 return mLabel; 207 return mLabel;
208} 208}
209 209
210QSpinBox *KPrefsWidTime::spinBox() 210QSpinBox *KPrefsWidTime::spinBox()
211{ 211{
212 return mSpin; 212 return mSpin;
213} 213}
214 214
215 215
216KPrefsWidRadios::KPrefsWidRadios(const QString &text,int *reference, 216KPrefsWidRadios::KPrefsWidRadios(const QString &text,int *reference,
217 QWidget *parent) 217 QWidget *parent)
218{ 218{
219 mReference = reference; 219 mReference = reference;
220 220
221 mBox = new QButtonGroup(1,Qt::Horizontal,text,parent); 221 mBox = new QButtonGroup(1,Qt::Horizontal,text,parent);
222 connect( mBox, SIGNAL( clicked(int)), SIGNAL( modified() ) ); 222 connect( mBox, SIGNAL( clicked(int)), SIGNAL( modified() ) );
223} 223}
224 224
225KPrefsWidRadios::~KPrefsWidRadios() 225KPrefsWidRadios::~KPrefsWidRadios()
226{ 226{
227} 227}
228 228
229void KPrefsWidRadios::addRadio(const QString &text) 229void KPrefsWidRadios::addRadio(const QString &text)
230{ 230{
231 new QRadioButton(text,mBox); 231 new QRadioButton(text,mBox);
232} 232}
233 233
234QButtonGroup *KPrefsWidRadios::groupBox() 234QButtonGroup *KPrefsWidRadios::groupBox()
235{ 235{
236 return mBox; 236 return mBox;
237} 237}
238 238
239void KPrefsWidRadios::readConfig() 239void KPrefsWidRadios::readConfig()
240{ 240{
241 mBox->setButton(*mReference); 241 mBox->setButton(*mReference);
242} 242}
243 243
244void KPrefsWidRadios::writeConfig() 244void KPrefsWidRadios::writeConfig()
245{ 245{
246 *mReference = mBox->id(mBox->selected()); 246 *mReference = mBox->id(mBox->selected());
247} 247}
248 248
249 249
250KPrefsWidString::KPrefsWidString(const QString &text,QString *reference, 250KPrefsWidString::KPrefsWidString(const QString &text,QString *reference,
251 QWidget *parent, QLineEdit::EchoMode echomode) 251 QWidget *parent, QLineEdit::EchoMode echomode)
252{ 252{
253 mReference = reference; 253 mReference = reference;
254 254
255 mLabel = new QLabel(text,parent); 255 mLabel = new QLabel(text,parent);
256 mEdit = new QLineEdit(parent); 256 mEdit = new QLineEdit(parent);
257 mEdit->setEchoMode( echomode ); 257 mEdit->setEchoMode( echomode );
258 connect( mEdit, SIGNAL( textChanged(const QString&) ), SIGNAL( modified() ) ); 258 connect( mEdit, SIGNAL( textChanged(const QString&) ), SIGNAL( modified() ) );
259 259
260} 260}
261 261
262KPrefsWidString::~KPrefsWidString() 262KPrefsWidString::~KPrefsWidString()
263{ 263{
264} 264}
265 265
266void KPrefsWidString::readConfig() 266void KPrefsWidString::readConfig()
267{ 267{
268 mEdit->setText(*mReference); 268 mEdit->setText(*mReference);
269} 269}
270 270
271void KPrefsWidString::writeConfig() 271void KPrefsWidString::writeConfig()
272{ 272{
273 *mReference = mEdit->text(); 273 *mReference = mEdit->text();
274} 274}
275 275
276QLabel *KPrefsWidString::label() 276QLabel *KPrefsWidString::label()
277{ 277{
278 return mLabel; 278 return mLabel;
279} 279}
280 280
281QLineEdit *KPrefsWidString::lineEdit() 281QLineEdit *KPrefsWidString::lineEdit()
282{ 282{
283 return mEdit; 283 return mEdit;
284} 284}
285 285
286 286
287KPrefsWidget::KPrefsWidget(KPrefs *prefs,QWidget *parent,const char *name) : 287KPrefsWidget::KPrefsWidget(KPrefs *prefs,QWidget *parent,const char *name) :
288 QWidget(parent, name ) 288 QWidget(parent, name )
289{ 289{
290 mPrefs = prefs; 290 mPrefs = prefs;
291 mPrefsWids.setAutoDelete( true );
291} 292}
292 293
293KPrefsWidget::~KPrefsWidget() 294KPrefsWidget::~KPrefsWidget()
294{ 295{
295} 296}
296 297
297void KPrefsWidget::addWid(KPrefsWid *wid) 298void KPrefsWidget::addWid(KPrefsWid *wid)
298{ 299{
299 mPrefsWids.append(wid); 300 mPrefsWids.append(wid);
300 connect( wid, SIGNAL( modified() ), this, SLOT( modified() ) ); 301 connect( wid, SIGNAL( modified() ), this, SLOT( modified() ) );
301 302
302} 303}
303 304
304KPrefsWidBool *KPrefsWidget::addWidBool(const QString &text,bool *reference,QWidget *parent) 305KPrefsWidBool *KPrefsWidget::addWidBool(const QString &text,bool *reference,QWidget *parent)
305{ 306{
306 KPrefsWidBool *w = new KPrefsWidBool(text,reference,parent); 307 KPrefsWidBool *w = new KPrefsWidBool(text,reference,parent);
307 addWid(w); 308 addWid(w);
308 return w; 309 return w;
309} 310}
310 311
311KPrefsWidTime *KPrefsWidget::addWidTime(const QString &text,int *reference,QWidget *parent) 312KPrefsWidTime *KPrefsWidget::addWidTime(const QString &text,int *reference,QWidget *parent)
312{ 313{
313 KPrefsWidTime *w = new KPrefsWidTime(text,reference,parent); 314 KPrefsWidTime *w = new KPrefsWidTime(text,reference,parent);
314 addWid(w); 315 addWid(w);
315 return w; 316 return w;
316} 317}
317 318
318KPrefsWidColor *KPrefsWidget::addWidColor(const QString &text,QColor *reference,QWidget *parent) 319KPrefsWidColor *KPrefsWidget::addWidColor(const QString &text,QColor *reference,QWidget *parent)
319{ 320{
320 KPrefsWidColor *w = new KPrefsWidColor(text,reference,parent); 321 KPrefsWidColor *w = new KPrefsWidColor(text,reference,parent);
321 addWid(w); 322 addWid(w);
322 return w; 323 return w;
323} 324}
324 325
325KPrefsWidRadios *KPrefsWidget::addWidRadios(const QString &text,int *reference,QWidget *parent) 326KPrefsWidRadios *KPrefsWidget::addWidRadios(const QString &text,int *reference,QWidget *parent)
326{ 327{
327 KPrefsWidRadios *w = new KPrefsWidRadios(text,reference,parent); 328 KPrefsWidRadios *w = new KPrefsWidRadios(text,reference,parent);
328 addWid(w); 329 addWid(w);
329 return w; 330 return w;
330} 331}
331 332
332KPrefsWidString *KPrefsWidget::addWidString(const QString &text,QString *reference,QWidget *parent) 333KPrefsWidString *KPrefsWidget::addWidString(const QString &text,QString *reference,QWidget *parent)
333{ 334{
334 KPrefsWidString *w = new KPrefsWidString(text,reference,parent); 335 KPrefsWidString *w = new KPrefsWidString(text,reference,parent);
335 addWid(w); 336 addWid(w);
336 return w; 337 return w;
337} 338}
338 339
339KPrefsWidString *KPrefsWidget::addWidPassword(const QString &text,QString *reference,QWidget *parent) 340KPrefsWidString *KPrefsWidget::addWidPassword(const QString &text,QString *reference,QWidget *parent)
340{ 341{
341 KPrefsWidString *w = new KPrefsWidString(text,reference,parent,QLineEdit::Password); 342 KPrefsWidString *w = new KPrefsWidString(text,reference,parent,QLineEdit::Password);
342 addWid(w); 343 addWid(w);
343 return w; 344 return w;
344} 345}
345 346
346KPrefsWidFont *KPrefsWidget::addWidFont(const QString &sampleText,const QString &buttonText, 347KPrefsWidFont *KPrefsWidget::addWidFont(const QString &sampleText,const QString &buttonText,
347 QFont *reference,QWidget *parent) 348 QFont *reference,QWidget *parent)
348{ 349{
349 KPrefsWidFont *w = new KPrefsWidFont(sampleText,buttonText,reference,parent); 350 KPrefsWidFont *w = new KPrefsWidFont(sampleText,buttonText,reference,parent);
350 addWid(w); 351 addWid(w);
351 return w; 352 return w;
352} 353}
353 354
354void KPrefsWidget::setDefaults() 355void KPrefsWidget::setDefaults()
355{ 356{
356 mPrefs->setDefaults(); 357 mPrefs->setDefaults();
357 358
358 readConfig(); 359 readConfig();
359} 360}
360 361
361void KPrefsWidget::readConfig() 362void KPrefsWidget::readConfig()
362{ 363{
363// kdDebug(5300) << "KPrefsDialog::readConfig()" << endl; 364// kdDebug(5300) << "KPrefsDialog::readConfig()" << endl;
364 365
365 KPrefsWid *wid; 366 KPrefsWid *wid;
366 for(wid = mPrefsWids.first();wid;wid=mPrefsWids.next()) { 367 for(wid = mPrefsWids.first();wid;wid=mPrefsWids.next()) {
367 wid->readConfig(); 368 wid->readConfig();
368 } 369 }
369 370
370 usrReadConfig(); 371 usrReadConfig();
371 372
372 emit changed( false ); 373 emit changed( false );
373 374
374} 375}
375 376
376void KPrefsWidget::writeConfig() 377void KPrefsWidget::writeConfig()
377{ 378{
378// kdDebug(5300) << "KPrefsDialog::writeConfig()" << endl; 379// kdDebug(5300) << "KPrefsDialog::writeConfig()" << endl;
379 380
380 KPrefsWid *wid; 381 KPrefsWid *wid;
381 for(wid = mPrefsWids.first();wid;wid=mPrefsWids.next()) { 382 for(wid = mPrefsWids.first();wid;wid=mPrefsWids.next()) {
382 wid->writeConfig(); 383 wid->writeConfig();
383 } 384 }
384 385
385 usrWriteConfig(); 386 usrWriteConfig();
386 387
387// kdDebug(5300) << "KPrefsDialog::writeConfig() now writing..." << endl; 388// kdDebug(5300) << "KPrefsDialog::writeConfig() now writing..." << endl;
388 389
389 mPrefs->writeConfig(); 390 mPrefs->writeConfig();
390 391
391 emit changed( false ); 392 emit changed( false );
392 393
393// kdDebug(5300) << "KPrefsDialog::writeConfig() done" << endl; 394// kdDebug(5300) << "KPrefsDialog::writeConfig() done" << endl;
394} 395}
395 396
396/*US 397/*US
397void KPrefsWidget::slotApply() 398void KPrefsWidget::slotApply()
398{ 399{
399 writeConfig(); 400 writeConfig();
400 emit configChanged(); 401 emit configChanged();
401} 402}
402 403
403void KPrefsDialog::slotOk() 404void KPrefsDialog::slotOk()
404{ 405{
405 slotApply(); 406 slotApply();
406 QDialog::accept(); 407 QDialog::accept();
407} 408}
408void KPrefsDialog::accept() 409void KPrefsDialog::accept()
409{ 410{
410 slotOk(); 411 slotOk();
411} 412}
412 413
413void KPrefsDialog::slotDefault() 414void KPrefsDialog::slotDefault()
414{ 415{
415 if (KMessageBox::warningContinueCancel(this, 416 if (KMessageBox::warningContinueCancel(this,
416 i18n("You are about to set all\npreferences to default values.\nAll " 417 i18n("You are about to set all\npreferences to default values.\nAll "
417 "custom modifications will be lost."),i18n("Setting Default Preferences"), 418 "custom modifications will be lost."),i18n("Setting Default Preferences"),
418 i18n("Continue")) 419 i18n("Continue"))
419 == KMessageBox::Continue) setDefaults(); 420 == KMessageBox::Continue) setDefaults();
420} 421}
421*/ 422*/
422 423
423void KPrefsWidget::modified() 424void KPrefsWidget::modified()
424{ 425{
425 emit changed( true ); 426 emit changed( true );
426} 427}
427 428