]> err.no Git - scalable-opengroupware.org/blob - UI/MailPartViewers/UIxMailPartTextViewer.m
27ecea50761b9fe3c3d3afe8ed6fd996d5985a37
[scalable-opengroupware.org] / UI / MailPartViewers / UIxMailPartTextViewer.m
1 /*
2   Copyright (C) 2004-2005 SKYRIX Software AG
3
4   This file is part of OpenGroupware.org.
5
6   OGo is free software; you can redistribute it and/or modify it under
7   the terms of the GNU Lesser General Public License as published by the
8   Free Software Foundation; either version 2, or (at your option) any
9   later version.
10
11   OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12   WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14   License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with OGo; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21
22 /*
23   UIxMailPartTextViewer
24
25   Show plaintext mail parts correctly formatted.
26
27   TODO: add server side wrapping.
28   TODO: add contained link detection.
29 */
30
31 #import <Foundation/NSException.h>
32
33 #import <NGExtensions/NSString+misc.h>
34
35 #import <SoObjects/SOGo/NSString+Utilities.h>
36
37 #import "UIxMailPartTextViewer.h"
38
39 @interface NSString (SOGoMailUIExtension)
40
41 - (NSString *) stringByConvertingCRLNToHTML;
42
43 @end
44
45 @implementation NSString (SOGoMailUIExtension)
46
47 static inline char *
48 convertChars (const char *oldString, unsigned int oldLength,
49               unsigned int *newLength)
50 {
51   const char *currentChar, *upperLimit;
52   char *newString, *destChar, *reallocated;
53   unsigned int length, maxLength, iteration;
54
55   maxLength = oldLength + 500;
56   newString = malloc (maxLength);
57   destChar = newString;
58   currentChar = oldString;
59
60   length = 0;
61   iteration = 0;
62
63   upperLimit = oldString + oldLength;
64   while ((unsigned int) currentChar < (unsigned int) upperLimit)
65     {
66       if (*currentChar != '\r')
67         {
68           if (*currentChar == '\n')
69             {
70               length = (unsigned int) destChar - (unsigned int) newString;
71               if ((length + (6 * iteration) + 500) > maxLength)
72                 {
73                   maxLength = length + (iteration * 6) + 500;
74                   reallocated = realloc (newString, maxLength);
75                   if (reallocated)
76                     newString = reallocated;
77                   else
78                     [NSException raise: NSMallocException
79                                  format: @"reallocation failed in %s",
80                                  __PRETTY_FUNCTION__];
81                   destChar = newString + length;
82                 }
83               strcpy (destChar, "<br />");
84               destChar += 6;
85               iteration++;
86             }
87           else
88             {
89               *destChar = *currentChar;
90               destChar++;
91             }
92         }
93       currentChar++;
94     }
95   *destChar = 0;
96   *newLength = (unsigned int) destChar - (unsigned int) newString;
97
98   return newString;
99 }
100
101 - (NSString *) stringByConvertingCRLNToHTML
102 {
103   NSString *convertedString;
104   char *newString;
105   unsigned int newLength;
106
107   newString
108     = convertChars ([self cStringUsingEncoding: NSUTF8StringEncoding],
109                     [self lengthOfBytesUsingEncoding: NSUTF8StringEncoding],
110                     &newLength);
111   convertedString = [[NSString alloc] initWithBytes: newString
112                                       length: newLength
113                                       encoding: NSUTF8StringEncoding];
114   [convertedString autorelease];
115   free (newString);
116
117   return convertedString;
118 }
119
120 @end
121
122 @implementation UIxMailPartTextViewer
123
124 - (NSString *) flatContentAsString
125 {
126   NSString *superContent;
127
128   superContent = [[super flatContentAsString] stringByEscapingHTMLString];
129
130   return [[superContent stringByDetectingURLs] stringByConvertingCRLNToHTML];
131 }
132
133 @end /* UIxMailPartTextViewer */