aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/basetypes/MCData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/basetypes/MCData.cpp')
-rw-r--r--src/core/basetypes/MCData.cpp170
1 files changed, 7 insertions, 163 deletions
diff --git a/src/core/basetypes/MCData.cpp b/src/core/basetypes/MCData.cpp
index 796f580e..1fee18aa 100644
--- a/src/core/basetypes/MCData.cpp
+++ b/src/core/basetypes/MCData.cpp
@@ -28,6 +28,7 @@
#include "MCBase64.h"
#include "MCSet.h"
#include "MCLock.h"
+#include "MCDataDecoderUtils.h"
#define MCDATA_DEFAULT_CHARSET "iso-8859-1"
@@ -565,170 +566,10 @@ Data * Data::dataWithContentsOfFile(String * filename)
return data;
}
-static size_t uudecode(const char * text, size_t size, char * dst, size_t dst_buf_size)
-{
- unsigned int count = 0;
- const char *b = text; /* beg */
- const char *s = b; /* src */
- const char *e = b+size; /* end */
- char *d = dst;
- int out = (*s++ & 0x7f) - 0x20;
-
- /* don't process lines without leading count character */
- if (out < 0)
- return size;
-
- /* dummy check. user must allocate buffer with appropriate length */
- if (dst_buf_size < out)
- return size;
-
- /* don't process begin and end lines */
- if ((strncasecmp((const char *)b, "begin ", 6) == 0) ||
- (strncasecmp((const char *)b, "end", 3) == 0))
- return size;
-
- //while (s < e - 4)
- while (s < e && count < out)
- {
- int v = 0;
- int i;
- for (i = 0; i < 4; i += 1) {
- char c = *s++;
- v = v << 6 | ((c - 0x20) & 0x3F);
- }
- for (i = 2; i >= 0; i -= 1) {
- char c = (char) (v & 0xFF);
- d[i] = c;
- v = v >> 8;
- }
- d += 3;
- count += 3;
- }
- return count;
-}
-
-static void decodedPartDeallocator(char * decoded, unsigned int decoded_length) {
- mailmime_decoded_part_free(decoded);
-};
-
Data * Data::decodedDataUsingEncoding(Encoding encoding)
{
- const char * text;
- size_t text_length;
-
- text = bytes();
- text_length = length();
-
- switch (encoding) {
- case Encoding7Bit:
- case Encoding8Bit:
- case EncodingBinary:
- case EncodingOther:
- default:
- {
- return this;
- }
- case EncodingBase64:
- case EncodingQuotedPrintable:
- {
- char * decoded;
- size_t decoded_length;
- size_t cur_token;
- int mime_encoding;
- Data * data;
-
- switch (encoding) {
- default: //disable warning
- case EncodingBase64:
- mime_encoding = MAILMIME_MECHANISM_BASE64;
- break;
- case EncodingQuotedPrintable:
- mime_encoding = MAILMIME_MECHANISM_QUOTED_PRINTABLE;
- break;
- }
-
- cur_token = 0;
- mailmime_part_parse(text, text_length, &cur_token,
- mime_encoding, &decoded, &decoded_length);
-
- data = Data::data();
- data->takeBytesOwnership(decoded, (unsigned int) decoded_length, decodedPartDeallocator);
- return data;
- }
- case EncodingUUEncode:
- {
- Data * data;
- const char * current_p;
-
- data = Data::dataWithCapacity((unsigned int) text_length);
-
- current_p = text;
- while (1) {
- /* In uuencoded files each data line usually have 45 bytes of decoded data.
- Maximum possible length is limited by (0x7f-0x20) bytes.
- So 256-bytes buffer is enough. */
- char decoded_buf[256];
- size_t decoded_length;
- size_t length;
- const char * p;
- const char * p1;
- const char * p2;
- const char * end_line;
-
- p1 = strchr(current_p, '\n');
- p2 = strchr(current_p, '\r');
- if (p1 == NULL) {
- p = p2;
- }
- else if (p2 == NULL) {
- p = p1;
- }
- else {
- if (p1 - current_p < p2 - current_p) {
- p = p1;
- }
- else {
- p = p2;
- }
- }
- end_line = p;
- if (p != NULL) {
- while ((size_t) (p - text) < text_length) {
- if ((* p != '\r') && (* p != '\n')) {
- break;
- }
- p ++;
- }
- }
- if (p == NULL) {
- length = text_length - (current_p - text);
- }
- else {
- length = end_line - current_p;
- }
- if (length == 0) {
- break;
- }
- decoded_length = uudecode(current_p, length, decoded_buf, sizeof(decoded_buf));
- if (decoded_length != 0 && decoded_length < length) {
- data->appendBytes(decoded_buf, (unsigned int) decoded_length);
- }
-
- if (p == NULL)
- break;
-
- current_p = p;
- while ((size_t) (current_p - text) < text_length) {
- if ((* current_p != '\r') && (* current_p != '\n')) {
- break;
- }
- current_p ++;
- }
- }
-
- return data;
- }
- }
+ Data * unused = NULL;
+ return MCDecodeData(this, encoding, false, &unused);
}
Data * Data::data()
@@ -765,11 +606,14 @@ void Data::importSerializable(HashMap * serializable)
ErrorCode Data::writeToFile(String * filename)
{
FILE * f = fopen(filename->fileSystemRepresentation(), "wb");
+
if (f == NULL) {
return ErrorFile;
}
size_t result = fwrite(bytes(), length(), 1, f);
- fclose(f);
+ if (fclose(f) != 0) {
+ return ErrorFile;
+ }
if (result == 0) {
return ErrorFile;
}