blob: 832648a5cce500fd6e0dad5ac7587b9902c9c4d9 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
--- kioslaves/imap4/mimeheader.cc 2005/07/26 18:54:59 438982
+++ kioslaves/imap4/mimeheader.cc 2007/03/28 21:58:46 647617
@@ -339,35 +339,47 @@
{
val = rfcDecoder::encodeRFC2231String (aValue);
}
+ //kdDebug(7116) << "mimeHeader::setParameter() - val = '" << val << "'" << endl;
//see if it needs to be truncated
vlen = val.length();
llen = aLabel.length();
- if (vlen + llen + 4 > 80 && llen < 80 - 8 )
+ if (vlen + llen + 4 > 80 && llen < 80 - 8 - 2 )
{
- int limit = 80 - 8 - (int)llen;
+ const int limit = 80 - 8 - 2 - (int)llen;
+ // the -2 is there to allow extending the length of a part of val
+ // by 1 or 2 in order to prevent an encoded character from being
+ // split in half
int i = 0;
QString shortValue;
QCString shortLabel;
while (!val.isEmpty ())
{
- //don't truncate the encoded chars
- int offset = 0;
- if (limit > int(vlen))
- limit = vlen;
- offset = val.findRev ('%', limit);
- if (offset == limit - 1 || offset == limit - 2)
- {
-// cout << "offset " << offset << "-" << limit << "=" << limit-offset << endl;
- offset = limit - offset;
+ int partLen; // the length of the next part of the value
+ if ( limit >= int(vlen) ) {
+ // the rest of the value fits completely into one continued header
+ partLen = vlen;
+ }
+ else {
+ partLen = limit;
+ // make sure that we don't split an encoded char in half
+ if ( val[partLen-1] == '%' ) {
+ partLen += 2;
+ }
+ else if ( partLen > 1 && val[partLen-2] == '%' ) {
+ partLen += 1;
+ }
+ // make sure partLen does not exceed vlen (could happen in case of
+ // an incomplete encoded char)
+ if ( partLen > int(vlen) ) {
+ partLen = vlen;
+ }
}
- else
- offset = 0;
- shortValue = val.left (limit - offset);
+ shortValue = val.left( partLen );
shortLabel.setNum (i);
shortLabel = aLabel + "*" + shortLabel;
- val = val.right (vlen - limit + offset);
- vlen = vlen - limit + offset;
+ val = val.right( vlen - partLen );
+ vlen = vlen - partLen;
if (encoded)
{
if (i == 0)
@@ -376,7 +388,9 @@
}
shortLabel += "*";
}
-// cout << shortLabel << "-" << shortValue << endl;
+ //kdDebug(7116) << "mimeHeader::setParameter() - shortLabel = '" << shortLabel << "'" << endl;
+ //kdDebug(7116) << "mimeHeader::setParameter() - shortValue = '" << shortValue << "'" << endl;
+ //kdDebug(7116) << "mimeHeader::setParameter() - val = '" << val << "'" << endl;
aDict->insert (shortLabel, new QString (shortValue));
i++;
}
|