diff options
| author | Vincent Richard <[email protected]> | 2013-12-29 10:02:12 +0100 |
|---|---|---|
| committer | Vincent Richard <[email protected]> | 2013-12-29 10:02:12 +0100 |
| commit | 152c6bed75598a6ca5efb7914701157270155833 (patch) | |
| tree | 8faced1d75a45c819630323da256248415992ed0 /src/utility | |
| parent | Merge branch 'master' of https://github.com/kisli/vmime (diff) | |
| download | vmime-152c6bed75598a6ca5efb7914701157270155833.tar.gz vmime-152c6bed75598a6ca5efb7914701157270155833.zip | |
Merged source and header files in directory structure. Got rid of SConstruct build.
Diffstat (limited to 'src/utility')
35 files changed, 0 insertions, 5039 deletions
diff --git a/src/utility/datetimeUtils.cpp b/src/utility/datetimeUtils.cpp deleted file mode 100644 index 2b55177e..00000000 --- a/src/utility/datetimeUtils.cpp +++ /dev/null @@ -1,333 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/datetimeUtils.hpp" - -#include <stdexcept> - - -namespace vmime { -namespace utility { - - -#ifndef VMIME_BUILDING_DOC - -static inline void nextMonth(datetime& d) -{ - if (d.getMonth() >= 12) - { - d.setMonth(1); - d.setYear(d.getYear() + 1); - } - else - { - d.setMonth(d.getMonth() + 1); - } -} - - -static inline void prevMonth(datetime& d) -{ - if (d.getMonth() <= 1) - { - d.setYear(d.getYear() - 1); - d.setMonth(12); - } - else - { - d.setMonth(d.getMonth() - 1); - } -} - - -static inline void nextDay(datetime& d) -{ - - if (d.getDay() >= datetimeUtils::getDaysInMonth(d.getYear(), d.getMonth())) - { - d.setDay(1); - nextMonth(d); - } - else - { - d.setDay(d.getDay() + 1); - } -} - - -static inline void prevDay(datetime& d) -{ - if (d.getDay() <= 1) - { - prevMonth(d); - d.setDay(datetimeUtils::getDaysInMonth(d.getYear(), d.getMonth())); - } - else - { - d.setDay(d.getDay() - 1); - } -} - - -static inline void nextHour(datetime& d) -{ - if (d.getHour() >= 23) - { - d.setHour(0); - nextDay(d); - } - else - { - d.setHour(d.getHour() + 1); - } -} - - -static inline void prevHour(datetime& d) -{ - if (d.getHour() <= 0) - { - d.setHour(23); - prevDay(d); - } - else - { - d.setHour(d.getHour() - 1); - } -} - - -static inline void addHoursAndMinutes(datetime& d, const int h, const int m) -{ - d.setMinute(d.getMinute() + m); - - if (d.getMinute() >= 60) - { - d.setMinute(d.getMinute() - 60); - nextHour(d); - } - - d.setHour(d.getHour() + h); - - if (d.getHour() >= 24) - { - d.setHour(d.getHour() - 24); - nextDay(d); - } -} - - -static inline void substractHoursAndMinutes(datetime& d, const int h, const int m) -{ - if (m > d.getMinute()) - { - d.setMinute(60 - (m - d.getMinute())); - prevHour(d); - } - else - { - d.setMinute(d.getMinute() - m); - } - - if (h > d.getHour()) - { - d.setHour(24 - (h - d.getHour())); - prevDay(d); - } - else - { - d.setHour(d.getHour() - h); - } -} - -#endif // VMIME_BUILDING_DOC - - -const datetime datetimeUtils::toUniversalTime(const datetime& date) -{ - if (date.getZone() == datetime::GMT) - return date; // no conversion needed - - datetime nd(date); - nd.setZone(datetime::GMT); - - const int z = date.getZone(); - const int h = (z < 0) ? (-z / 60) : (z / 60); - const int m = (z < 0) ? (-z - h * 60) : (z - h * 60); - - if (z < 0) // GMT-hhmm: add hours and minutes to date - addHoursAndMinutes(nd, h, m); - else // GMT+hhmm: substract hours and minutes from date - substractHoursAndMinutes(nd, h, m); - - return (nd); -} - - -const datetime datetimeUtils::toLocalTime(const datetime& date, const int zone) -{ - datetime utcDate(date); - - if (utcDate.getZone() != datetime::GMT) - utcDate = toUniversalTime(date); // convert to UT before - - datetime nd(utcDate); - nd.setZone(zone); - - const int h = (zone < 0) ? (-zone / 60) : (zone / 60); - const int m = (zone < 0) ? (-zone - h * 60) : (zone - h * 60); - - if (zone < 0) // GMT+hhmm: substract hours and minutes from date - substractHoursAndMinutes(nd, h, m); - else // GMT-hhmm: add hours and minutes to date - addHoursAndMinutes(nd, h, m); - - return (nd); -} - - -bool datetimeUtils::isLeapYear(const int year) -{ - // From RFC 3339 - Appendix C. Leap Years: - return ((year % 4) == 0 && (year % 100 != 0 || year % 400 == 0)); -} - - -int datetimeUtils::getDaysInMonth(const int year, const int month) -{ - static const int daysInMonth[12] = - { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - static const int daysInMonthLeapYear[12] = - { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - - if (month < 1 || month > 12) - throw std::out_of_range("Invalid month number"); - - return (isLeapYear(year) ? daysInMonthLeapYear[month - 1] : daysInMonth[month - 1]); -} - - -int datetimeUtils::getDayOfWeek(const int year, const int month, const int day) -{ - int y = year; - int m = month; - - if (month < 1 || month > 12) - throw std::out_of_range("Invalid month number"); - else if (day < 1 || day > getDaysInMonth(year, month)) - throw std::out_of_range("Invalid day number"); - - // From RFC-3339 - Appendix B. Day of the Week - - // Adjust months so February is the last one - m -= 2; - - if (m < 1) - { - m += 12; - --y; - } - - // Split by century - const int cent = y / 100; - y %= 100; - - return (((26 * m - 2) / 10 + day + y + (y >> 2) + (cent >> 2) + 5 * cent) % 7); -} - - -int datetimeUtils::getWeekOfYear(const int year, const int month, const int day, const bool iso) -{ - // Algorithm from http://personal.ecu.edu/mccartyr/ISOwdALG.txt - - const bool leapYear = ((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0; - const bool leapYear_1 = (((year - 1) % 4) == 0 && ((year - 1) % 100) != 0) || ((year - 1) % 400) == 0; - - // 4. Find the DayOfYearNumber for Y M D - static const int DAY_OF_YEAR_NUMBER_MAP[12] = - { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; - - int DayOfYearNumber = day + DAY_OF_YEAR_NUMBER_MAP[month - 1]; - - if (leapYear && month > 2) - DayOfYearNumber += 1; - - // 5. Find the Jan1Weekday for Y (Monday=1, Sunday=7) - const int YY = (year - 1) % 100; - const int C = (year - 1) - YY; - const int G = YY + YY / 4; - const int Jan1Weekday = 1 + (((((C / 100) % 4) * 5) + G) % 7); - - // 6. Find the Weekday for Y M D - const int H = DayOfYearNumber + (Jan1Weekday - 1); - const int Weekday = 1 + ((H - 1) % 7); - - // 7. Find if Y M D falls in YearNumber Y-1, WeekNumber 52 or 53 - int YearNumber = 0, WeekNumber = 0; - - if (DayOfYearNumber <= (8 - Jan1Weekday) && Jan1Weekday > 4) - { - YearNumber = year - 1; - - if (Jan1Weekday == 5 || (Jan1Weekday == 6 && leapYear_1)) - WeekNumber = 53; - else - WeekNumber = 52; - } - else - { - YearNumber = year; - } - - // 8. Find if Y M D falls in YearNumber Y+1, WeekNumber 1 - if (YearNumber == year) - { - const int I = (leapYear ? 366 : 365); - - if ((I - DayOfYearNumber) < (4 - Weekday)) - { - YearNumber = year + 1; - WeekNumber = 1; - } - } - - // 9. Find if Y M D falls in YearNumber Y, WeekNumber 1 through 53 - if (YearNumber == year) - { - const int J = DayOfYearNumber + (7 - Weekday) + (Jan1Weekday - 1); - - WeekNumber = J / 7; - - if (Jan1Weekday > 4) - WeekNumber -= 1; - } - - if (!iso && (WeekNumber == 1 && month == 12)) - WeekNumber = 53; - - return WeekNumber; -} - - -} // utility -} // vmime diff --git a/src/utility/encoder/b64Encoder.cpp b/src/utility/encoder/b64Encoder.cpp deleted file mode 100644 index 274c23c0..00000000 --- a/src/utility/encoder/b64Encoder.cpp +++ /dev/null @@ -1,330 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/encoder/b64Encoder.hpp" -#include "vmime/parserHelpers.hpp" - - -namespace vmime { -namespace utility { -namespace encoder { - - -b64Encoder::b64Encoder() -{ -} - - -const std::vector <string> b64Encoder::getAvailableProperties() const -{ - std::vector <string> list(encoder::getAvailableProperties()); - - list.push_back("maxlinelength"); - - return (list); -} - - -// 7-bits alphabet used to encode binary data -const unsigned char b64Encoder::sm_alphabet[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - -const unsigned char b64Encoder::sm_decodeMap[256] = -{ - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0x00 - 0x0f - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0x10 - 0x1f - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3e,0xff,0xff,0xff,0x3f, // 0x20 - 0x2f - 0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0xff,0xff,0xff,0x3d,0xff,0xff, // 0x30 - 0x3f - 0xff,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e, // 0x40 - 0x4f - 0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0xff,0xff,0xff,0xff,0xff, // 0x50 - 0x5f - 0xff,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, // 0x60 - 0x6f - 0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0xff,0xff,0xff,0xff,0xff, // 0x70 - 0x7f - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0x80 - 0x8f - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0x90 - 0x9f - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0xa0 - 0xaf - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0xb0 - 0xbf - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0xc0 - 0xcf - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0xd0 - 0xdf - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0xe0 - 0xef - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // 0xf0 - 0xff -}; - -#ifndef VMIME_BUILDING_DOC - #define B64_WRITE(s, x, l) s.write(reinterpret_cast <byte_t*>(x), l) -#endif // VMIME_BUILDING_DOC - - - -size_t b64Encoder::encode(utility::inputStream& in, - utility::outputStream& out, utility::progressListener* progress) -{ - in.reset(); // may not work... - - const size_t propMaxLineLength = - getProperties().getProperty <size_t>("maxlinelength", static_cast <size_t>(-1)); - - const bool cutLines = (propMaxLineLength != static_cast <size_t>(-1)); - const size_t maxLineLength = std::min(propMaxLineLength, static_cast <size_t>(76)); - - // Process data - byte_t buffer[65536]; - size_t bufferLength = 0; - size_t bufferPos = 0; - - byte_t bytes[3]; - byte_t output[4]; - - size_t total = 0; - size_t inTotal = 0; - - size_t curCol = 0; - - if (progress) - progress->start(0); - - while (bufferPos < bufferLength || !in.eof()) - { - if (bufferPos >= bufferLength) - { - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - - if (bufferLength == 0) - break; - } - - // Get 3 bytes of data - int count = 0; - - while (count < 3 && bufferPos < bufferLength) - bytes[count++] = buffer[bufferPos++]; - - while (count < 3) - { - // There may be more data in the next chunk... - if (bufferPos >= bufferLength) - { - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - - if (bufferLength == 0) - break; - } - - while (count < 3 && bufferPos < bufferLength) - bytes[count++] = buffer[bufferPos++]; - } - - // Encode data - switch (count) - { - case 1: - - output[0] = sm_alphabet[(bytes[0] & 0xFC) >> 2]; - output[1] = sm_alphabet[(bytes[0] & 0x03) << 4]; - output[2] = sm_alphabet[64]; // padding - output[3] = sm_alphabet[64]; // padding - - break; - - case 2: - - output[0] = sm_alphabet[(bytes[0] & 0xFC) >> 2]; - output[1] = sm_alphabet[((bytes[0] & 0x03) << 4) | ((bytes[1] & 0xF0) >> 4)]; - output[2] = sm_alphabet[(bytes[1] & 0x0F) << 2]; - output[3] = sm_alphabet[64]; // padding - - break; - - default: - case 3: - - output[0] = sm_alphabet[(bytes[0] & 0xFC) >> 2]; - output[1] = sm_alphabet[((bytes[0] & 0x03) << 4) | ((bytes[1] & 0xF0) >> 4)]; - output[2] = sm_alphabet[((bytes[1] & 0x0F) << 2) | ((bytes[2] & 0xC0) >> 6)]; - output[3] = sm_alphabet[(bytes[2] & 0x3F)]; - - break; - } - - // Write encoded data to output stream - B64_WRITE(out, output, 4); - - inTotal += count; - total += 4; - curCol += 4; - - if (cutLines && curCol + 2 /* \r\n */ + 4 /* next bytes */ >= maxLineLength) - { - out.write("\r\n", 2); - curCol = 0; - } - - if (progress) - progress->progress(inTotal, inTotal); - } - - if (progress) - progress->stop(inTotal); - - return (total); -} - - -size_t b64Encoder::decode(utility::inputStream& in, - utility::outputStream& out, utility::progressListener* progress) -{ - in.reset(); // may not work... - - // Process the data - byte_t buffer[16384]; - size_t bufferLength = 0; - size_t bufferPos = 0; - - size_t total = 0; - size_t inTotal = 0; - - byte_t bytes[4]; - byte_t output[3]; - - if (progress) - progress->start(0); - - while (bufferPos < bufferLength || !in.eof()) - { - bytes[0] = '='; - bytes[1] = '='; - bytes[2] = '='; - bytes[3] = '='; - - // Need to get more data? - if (bufferPos >= bufferLength) - { - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - - // No more data - if (bufferLength == 0) - break; - } - - // 4 bytes of input provide 3 bytes of output, so - // get the next 4 bytes from the input stream. - int count = 0; - - while (count < 4 && bufferPos < bufferLength) - { - const byte_t c = buffer[bufferPos++]; - - if (!parserHelpers::isSpace(c)) - bytes[count++] = c; - } - - if (count != 4) - { - while (count < 4 && !in.eof()) - { - // Data continues on the next chunk - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - - while (count < 4 && bufferPos < bufferLength) - { - const byte_t c = buffer[bufferPos++]; - - if (!parserHelpers::isSpace(c)) - bytes[count++] = c; - } - } - } - - // Decode the bytes - byte_t c1 = bytes[0]; - byte_t c2 = bytes[1]; - - if (c1 == '=' || c2 == '=') // end - break; - - output[0] = static_cast <byte_t>((sm_decodeMap[c1] << 2) | ((sm_decodeMap[c2] & 0x30) >> 4)); - - c1 = bytes[2]; - - if (c1 == '=') // end - { - B64_WRITE(out, output, 1); - total += 1; - break; - } - - output[1] = static_cast <byte_t>(((sm_decodeMap[c2] & 0xf) << 4) | ((sm_decodeMap[c1] & 0x3c) >> 2)); - - c2 = bytes[3]; - - if (c2 == '=') // end - { - B64_WRITE(out, output, 2); - total += 2; - break; - } - - output[2] = static_cast <byte_t>(((sm_decodeMap[c1] & 0x03) << 6) | sm_decodeMap[c2]); - - B64_WRITE(out, output, 3); - total += 3; - inTotal += count; - - if (progress) - progress->progress(inTotal, inTotal); - } - - if (progress) - progress->stop(inTotal); - - return (total); -} - - -size_t b64Encoder::getEncodedSize(const size_t n) const -{ - const size_t propMaxLineLength = - getProperties().getProperty <size_t>("maxlinelength", static_cast <size_t>(-1)); - - const bool cutLines = (propMaxLineLength != static_cast <size_t>(-1)); - const size_t maxLineLength = std::min(propMaxLineLength, static_cast <size_t>(76)); - - return (n * 4) / 3 // 3 bytes of input provide 4 bytes of output - + (cutLines ? (n / maxLineLength) * 2 : 0) // CRLF (2 bytes) for each line. - + 4; // padding -} - - -size_t b64Encoder::getDecodedSize(const size_t n) const -{ - // 4 bytes of input provide 3 bytes of output - return (n * 3) / 4; -} - - -} // encoder -} // utility -} // vmime diff --git a/src/utility/encoder/binaryEncoder.cpp b/src/utility/encoder/binaryEncoder.cpp deleted file mode 100644 index 7d7c40d1..00000000 --- a/src/utility/encoder/binaryEncoder.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/encoder/binaryEncoder.hpp" - - -namespace vmime { -namespace utility { -namespace encoder { - - -binaryEncoder::binaryEncoder() -{ -} - - -} // encoder -} // utility -} // vmime diff --git a/src/utility/encoder/eightBitEncoder.cpp b/src/utility/encoder/eightBitEncoder.cpp deleted file mode 100644 index 4ab07f06..00000000 --- a/src/utility/encoder/eightBitEncoder.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/encoder/eightBitEncoder.hpp" - - -namespace vmime { -namespace utility { -namespace encoder { - - -eightBitEncoder::eightBitEncoder() -{ -} - - -} // encoder -} // utility -} // vmime diff --git a/src/utility/encoder/encoder.cpp b/src/utility/encoder/encoder.cpp deleted file mode 100644 index b4b13249..00000000 --- a/src/utility/encoder/encoder.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/encoder/encoder.hpp" -#include "vmime/exception.hpp" - - -namespace vmime { -namespace utility { -namespace encoder { - - -encoder::encoder() -{ -} - - -encoder::~encoder() -{ -} - - -const propertySet& encoder::getProperties() const -{ - return (m_props); -} - - -propertySet& encoder::getProperties() -{ - return (m_props); -} - - -const propertySet& encoder::getResults() const -{ - return (m_results); -} - - -propertySet& encoder::getResults() -{ - return (m_results); -} - - -const std::vector <string> encoder::getAvailableProperties() const -{ - std::vector <string> list; - return (list); -} - - -} // encoder -} // utility -} // vmime diff --git a/src/utility/encoder/encoderFactory.cpp b/src/utility/encoder/encoderFactory.cpp deleted file mode 100644 index 098a810a..00000000 --- a/src/utility/encoder/encoderFactory.cpp +++ /dev/null @@ -1,120 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/encoder/encoderFactory.hpp" -#include "vmime/exception.hpp" - -#include "vmime/utility/encoder/b64Encoder.hpp" -#include "vmime/utility/encoder/qpEncoder.hpp" -#include "vmime/utility/encoder/uuEncoder.hpp" -#include "vmime/utility/encoder/binaryEncoder.hpp" -#include "vmime/utility/encoder/sevenBitEncoder.hpp" -#include "vmime/utility/encoder/eightBitEncoder.hpp" - - -namespace vmime { -namespace utility { -namespace encoder { - - -encoderFactory::encoderFactory() -{ - // Register some default encoders - registerName <b64Encoder>("base64"); - registerName <qpEncoder>("quoted-printable"); - registerName <uuEncoder>("uuencode"); - registerName <sevenBitEncoder>("7bit"); - registerName <eightBitEncoder>("8bit"); - registerName <binaryEncoder>("binary"); - - // Also register some non-standard encoding names - registerName <sevenBitEncoder>("7-bit"); - registerName <eightBitEncoder>("8-bit"); - - // Finally, register some bogus encoding names, for compatibility - registerName <qpEncoder>("bmoted-printable"); -} - - -encoderFactory::~encoderFactory() -{ -} - - -shared_ptr <encoderFactory> encoderFactory::getInstance() -{ - static encoderFactory instance; - return shared_ptr <encoderFactory>(&instance, noop_shared_ptr_deleter <encoderFactory>()); -} - - -shared_ptr <encoder> encoderFactory::create(const string& name) -{ - return (getEncoderByName(name)->create()); -} - - -const shared_ptr <const encoderFactory::registeredEncoder> encoderFactory::getEncoderByName(const string& name) const -{ - const string lcName(utility::stringUtils::toLower(name)); - - for (std::vector <shared_ptr <registeredEncoder> >::const_iterator it = m_encoders.begin() ; - it != m_encoders.end() ; ++it) - { - if ((*it)->getName() == lcName) - return (*it); - } - - throw exceptions::no_encoder_available(name); -} - - -size_t encoderFactory::getEncoderCount() const -{ - return (m_encoders.size()); -} - - -const shared_ptr <const encoderFactory::registeredEncoder> encoderFactory::getEncoderAt(const size_t pos) const -{ - return (m_encoders[pos]); -} - - -const std::vector <shared_ptr <const encoderFactory::registeredEncoder> > encoderFactory::getEncoderList() const -{ - std::vector <shared_ptr <const registeredEncoder> > res; - - for (std::vector <shared_ptr <registeredEncoder> >::const_iterator it = m_encoders.begin() ; - it != m_encoders.end() ; ++it) - { - res.push_back(*it); - } - - return (res); -} - - -} // encoder -} // utility -} // vmime diff --git a/src/utility/encoder/noopEncoder.cpp b/src/utility/encoder/noopEncoder.cpp deleted file mode 100644 index 3d991b5d..00000000 --- a/src/utility/encoder/noopEncoder.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/encoder/noopEncoder.hpp" - -#include "vmime/utility/streamUtils.hpp" - - -namespace vmime { -namespace utility { -namespace encoder { - - -noopEncoder::noopEncoder() -{ -} - - -size_t noopEncoder::encode(utility::inputStream& in, - utility::outputStream& out, utility::progressListener* progress) -{ - in.reset(); // may not work... - - // No encoding performed - size_t res = 0; - - if (progress) - res = utility::bufferedStreamCopy(in, out, 0, progress); - else - res = utility::bufferedStreamCopy(in, out); - - return res; -} - - -size_t noopEncoder::decode(utility::inputStream& in, - utility::outputStream& out, utility::progressListener* progress) -{ - in.reset(); // may not work... - - // No decoding performed - size_t res = 0; - - if (progress) - res = utility::bufferedStreamCopy(in, out, 0, progress); - else - res = utility::bufferedStreamCopy(in, out); - - return res; -} - - -size_t noopEncoder::getEncodedSize(const size_t n) const -{ - return n; -} - - -size_t noopEncoder::getDecodedSize(const size_t n) const -{ - return n; -} - - -} // encoder -} // utility -} // vmime diff --git a/src/utility/encoder/qpEncoder.cpp b/src/utility/encoder/qpEncoder.cpp deleted file mode 100644 index c77b5163..00000000 --- a/src/utility/encoder/qpEncoder.cpp +++ /dev/null @@ -1,558 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/encoder/qpEncoder.hpp" -#include "vmime/parserHelpers.hpp" - - -namespace vmime { -namespace utility { -namespace encoder { - - -qpEncoder::qpEncoder() -{ -} - - -const std::vector <string> qpEncoder::getAvailableProperties() const -{ - std::vector <string> list(encoder::getAvailableProperties()); - - list.push_back("maxlinelength"); - - list.push_back("text"); // if set, '\r' and '\n' are not hex-encoded. - // WARNING! You should not use this for binary data! - - list.push_back("rfc2047"); // for header fields encoding (RFC #2047) - - return (list); -} - - - -// Hex-encoding table -const unsigned char qpEncoder::sm_hexDigits[] = "0123456789ABCDEF"; - - -// RFC-2047 encoding table: we always encode RFC-2047 using the restricted -// charset, that is the one used for 'phrase' in From/To/Cc/... headers. -// -// " The set of characters that may be used in a "Q"-encoded 'encoded-word' -// is restricted to: <upper and lower case ASCII letters, decimal digits, -// "!", "*", "+", "-", "/", "=", and "_" (underscore, ASCII 95.)>. " -// -// Two special cases: -// - encode space (32) as underscore (95) -// - encode underscore as hex (=5F) -// -// This is a quick lookup table: -// '1' means "encode", '0' means "no encoding" -// -const vmime_uint8 qpEncoder::sm_RFC2047EncodeTable[] = -{ - /* 0 NUL */ 1, /* 1 SOH */ 1, /* 2 STX */ 1, /* 3 ETX */ 1, /* 4 EOT */ 1, /* 5 ENQ */ 1, - /* 6 ACK */ 1, /* 7 BEL */ 1, /* 8 BS */ 1, /* 9 TAB */ 1, /* 10 LF */ 1, /* 11 VT */ 1, - /* 12 FF */ 1, /* 13 CR */ 1, /* 14 SO */ 1, /* 15 SI */ 1, /* 16 DLE */ 1, /* 17 DC1 */ 1, - /* 18 DC2 */ 1, /* 19 DC3 */ 1, /* 20 DC4 */ 1, /* 21 NAK */ 1, /* 22 SYN */ 1, /* 23 ETB */ 1, - /* 24 CAN */ 1, /* 25 EM */ 1, /* 26 SUB */ 1, /* 27 ESC */ 1, /* 28 FS */ 1, /* 29 GS */ 1, - /* 30 RS */ 1, /* 31 US */ 1, /* 32 SPACE*/ 1, /* 33 ! */ 0, /* 34 " */ 1, /* 35 # */ 1, - /* 36 $ */ 1, /* 37 % */ 1, /* 38 & */ 1, /* 39 ' */ 1, /* 40 ( */ 1, /* 41 ) */ 1, - /* 42 * */ 0, /* 43 + */ 0, /* 44 , */ 1, /* 45 - */ 0, /* 46 . */ 1, /* 47 / */ 0, - /* 48 0 */ 0, /* 49 1 */ 0, /* 50 2 */ 0, /* 51 3 */ 0, /* 52 4 */ 0, /* 53 5 */ 0, - /* 54 6 */ 0, /* 55 7 */ 0, /* 56 8 */ 0, /* 57 9 */ 0, /* 58 : */ 1, /* 59 ; */ 1, - /* 60 < */ 1, /* 61 = */ 1, /* 62 > */ 1, /* 63 ? */ 1, /* 64 @ */ 1, /* 65 A */ 0, - /* 66 B */ 0, /* 67 C */ 0, /* 68 D */ 0, /* 69 E */ 0, /* 70 F */ 0, /* 71 G */ 0, - /* 72 H */ 0, /* 73 I */ 0, /* 74 J */ 0, /* 75 K */ 0, /* 76 L */ 0, /* 77 M */ 0, - /* 78 N */ 0, /* 79 O */ 0, /* 80 P */ 0, /* 81 Q */ 0, /* 82 R */ 0, /* 83 S */ 0, - /* 84 T */ 0, /* 85 U */ 0, /* 86 V */ 0, /* 87 W */ 0, /* 88 X */ 0, /* 89 Y */ 0, - /* 90 Z */ 0, /* 91 [ */ 1, /* 92 " */ 1, /* 93 ] */ 1, /* 94 ^ */ 1, /* 95 _ */ 1, - /* 96 ` */ 1, /* 97 a */ 0, /* 98 b */ 0, /* 99 c */ 0, /* 100 d */ 0, /* 101 e */ 0, - /* 102 f */ 0, /* 103 g */ 0, /* 104 h */ 0, /* 105 i */ 0, /* 106 j */ 0, /* 107 k */ 0, - /* 108 l */ 0, /* 109 m */ 0, /* 110 n */ 0, /* 111 o */ 0, /* 112 p */ 0, /* 113 q */ 0, - /* 114 r */ 0, /* 115 s */ 0, /* 116 t */ 0, /* 117 u */ 0, /* 118 v */ 0, /* 119 w */ 0, - /* 120 x */ 0, /* 121 y */ 0, /* 122 z */ 0, /* 123 { */ 1, /* 124 | */ 1, /* 125 } */ 1, - /* 126 ~ */ 1, /* 127 DEL */ 1 -}; - - -// Hex-decoding table -const vmime_uint8 qpEncoder::sm_hexDecodeTable[256] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, - 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - - -// static -bool qpEncoder::RFC2047_isEncodingNeededForChar(const byte_t c) -{ - return (c >= 128 || sm_RFC2047EncodeTable[c] != 0); -} - - -// static -int qpEncoder::RFC2047_getEncodedLength(const byte_t c) -{ - if (c >= 128 || sm_RFC2047EncodeTable[c] != 0) - { - if (c == 32) // space - { - // Encoded as "_" - return 1; - } - else - { - // Hex encoding - return 3; - } - } - else - { - return 1; // no encoding - } -} - - -#ifndef VMIME_BUILDING_DOC - -#define QP_ENCODE_HEX(x) \ - outBuffer[outBufferPos] = '='; \ - outBuffer[outBufferPos + 1] = sm_hexDigits[x >> 4]; \ - outBuffer[outBufferPos + 2] = sm_hexDigits[x & 0xF]; \ - outBufferPos += 3; \ - curCol += 3 - -#define QP_WRITE(s, x, l) s.write(reinterpret_cast <byte_t*>(x), l) - -#endif // VMIME_BUILDING_DOC - - -size_t qpEncoder::encode(utility::inputStream& in, - utility::outputStream& out, utility::progressListener* progress) -{ - in.reset(); // may not work... - - const size_t propMaxLineLength = - getProperties().getProperty <size_t>("maxlinelength", static_cast <size_t>(-1)); - - const bool rfc2047 = getProperties().getProperty <bool>("rfc2047", false); - const bool text = getProperties().getProperty <bool>("text", false); // binary mode by default - - const bool cutLines = (propMaxLineLength != static_cast <size_t>(-1)); - const size_t maxLineLength = std::min(propMaxLineLength, static_cast <size_t>(74)); - - // Process the data - byte_t buffer[16384]; - size_t bufferLength = 0; - size_t bufferPos = 0; - - size_t curCol = 0; - - byte_t outBuffer[16384]; - size_t outBufferPos = 0; - - size_t total = 0; - size_t inTotal = 0; - - if (progress) - progress->start(0); - - while (bufferPos < bufferLength || !in.eof()) - { - // Flush current output buffer - if (outBufferPos + 6 >= static_cast <int>(sizeof(outBuffer))) - { - QP_WRITE(out, outBuffer, outBufferPos); - - total += outBufferPos; - outBufferPos = 0; - } - - // Need to get more data? - if (bufferPos >= bufferLength) - { - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - - // No more data - if (bufferLength == 0) - break; - } - - // Get the next char and encode it - const byte_t c = buffer[bufferPos++]; - - if (rfc2047) - { - if (c >= 128 || sm_RFC2047EncodeTable[c] != 0) - { - if (c == 32) // space - { - // RFC-2047, Page 5, 4.2. The "Q" encoding: - // << The 8-bit hexadecimal value 20 (e.g., ISO-8859-1 SPACE) may be - // represented as "_" (underscore, ASCII 95.). >> - outBuffer[outBufferPos++] = '_'; - ++curCol; - } - else - { - // Other characters: '=' + hexadecimal encoding - QP_ENCODE_HEX(c); - } - } - else - { - // No encoding - outBuffer[outBufferPos++] = c; - ++curCol; - } - } - else - { - switch (c) - { - case 46: // . - { - if (curCol == 0) - { - // If a '.' appears at the beginning of a line, we encode it to - // to avoid problems with SMTP servers... ("\r\n.\r\n" means the - // end of data transmission). - QP_ENCODE_HEX('.'); - continue; - } - - outBuffer[outBufferPos++] = '.'; - ++curCol; - break; - } - case 32: // space - { - // Need to get more data? - if (bufferPos >= bufferLength) - { - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - } - - // Spaces cannot appear at the end of a line. So, encode the space. - if (bufferPos >= bufferLength || - (buffer[bufferPos] == '\r' || buffer[bufferPos] == '\n')) - { - QP_ENCODE_HEX(' '); - } - else - { - outBuffer[outBufferPos++] = ' '; - ++curCol; - } - - break; - } - case 9: // TAB - { - QP_ENCODE_HEX(c); - break; - } - case 13: // CR - case 10: // LF - { - // RFC-2045/6.7(4) - - // Text data - if (text && !rfc2047) - { - outBuffer[outBufferPos++] = c; - ++curCol; - } - // Binary data - else - { - QP_ENCODE_HEX(c); - } - - break; - } - case 61: // = - { - QP_ENCODE_HEX('='); - break; - } - /* - Rule #2: (Literal representation) Octets with decimal values of 33 - through 60 inclusive, and 62 through 126, inclusive, MAY be - represented as the ASCII characters which correspond to those - octets (EXCLAMATION POINT through LESS THAN, and GREATER THAN - through TILDE, respectively). - */ - default: - - //if ((c >= 33 && c <= 60) || (c >= 62 && c <= 126)) - if (c >= 33 && c <= 126 && c != 61 && c != 63) - { - outBuffer[outBufferPos++] = c; - ++curCol; - } - // Other characters: '=' + hexadecimal encoding - else - { - QP_ENCODE_HEX(c); - } - - break; - - } // switch (c) - - // Soft line break : "=\r\n" - if (cutLines && curCol >= maxLineLength - 1) - { - outBuffer[outBufferPos] = '='; - outBuffer[outBufferPos + 1] = '\r'; - outBuffer[outBufferPos + 2] = '\n'; - - outBufferPos += 3; - curCol = 0; - } - - } // !rfc2047 - - ++inTotal; - - if (progress) - progress->progress(inTotal, inTotal); - } - - // Flush remaining output buffer - if (outBufferPos != 0) - { - QP_WRITE(out, outBuffer, outBufferPos); - total += outBufferPos; - } - - if (progress) - progress->stop(inTotal); - - return (total); -} - - -size_t qpEncoder::decode(utility::inputStream& in, - utility::outputStream& out, utility::progressListener* progress) -{ - in.reset(); // may not work... - - // Process the data - const bool rfc2047 = getProperties().getProperty <bool>("rfc2047", false); - - byte_t buffer[16384]; - size_t bufferLength = 0; - size_t bufferPos = 0; - - byte_t outBuffer[16384]; - size_t outBufferPos = 0; - - size_t total = 0; - size_t inTotal = 0; - - while (bufferPos < bufferLength || !in.eof()) - { - // Flush current output buffer - if (outBufferPos >= sizeof(outBuffer)) - { - QP_WRITE(out, outBuffer, outBufferPos); - - total += outBufferPos; - outBufferPos = 0; - } - - // Need to get more data? - if (bufferPos >= bufferLength) - { - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - - // No more data - if (bufferLength == 0) - break; - } - - // Decode the next sequence (hex-encoded byte or printable character) - byte_t c = buffer[bufferPos++]; - - ++inTotal; - - switch (c) - { - case '=': - { - if (bufferPos >= bufferLength) - { - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - } - - if (bufferPos < bufferLength) - { - c = buffer[bufferPos++]; - - ++inTotal; - - switch (c) - { - // Ignore soft line break ("=\r\n" or "=\n") - case '\r': - - // Read one byte more - if (bufferPos >= bufferLength) - { - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - } - - if (bufferPos < bufferLength) - { - ++bufferPos; - ++inTotal; - } - - break; - - case '\n': - - break; - - // Hex-encoded char - default: - { - // We need another byte... - if (bufferPos >= bufferLength) - { - bufferLength = in.read(buffer, sizeof(buffer)); - bufferPos = 0; - } - - if (bufferPos < bufferLength) - { - const byte_t next = buffer[bufferPos++]; - - ++inTotal; - - const byte_t value = static_cast <byte_t> - (sm_hexDecodeTable[c] * 16 + sm_hexDecodeTable[next]); - - outBuffer[outBufferPos++] = value; - } - else - { - // Premature end-of-data - } - - break; - } - - } - } - else - { - // Premature end-of-data - } - - break; - } - case '_': - { - if (rfc2047) - { - // RFC-2047, Page 5, 4.2. The "Q" encoding: - // << Note that the "_" always represents hexadecimal 20, even if the SPACE - // character occupies a different code position in the character set in use. >> - outBuffer[outBufferPos++] = 0x20; - break; - } - - // no break here... - } - default: - { - outBuffer[outBufferPos++] = c; - } - - } - - if (progress) - progress->progress(inTotal, inTotal); - } - - // Flush remaining output buffer - if (outBufferPos != 0) - { - QP_WRITE(out, outBuffer, outBufferPos); - total += outBufferPos; - } - - if (progress) - progress->stop(inTotal); - - return (total); -} - - -size_t qpEncoder::getEncodedSize(const size_t n) const -{ - const size_t propMaxLineLength = - getProperties().getProperty <size_t>("maxlinelength", static_cast <size_t>(-1)); - - const bool cutLines = (propMaxLineLength != static_cast <size_t>(-1)); - const size_t maxLineLength = std::min(propMaxLineLength, static_cast <size_t>(74)); - - // Worst cast: 1 byte of input provide 3 bytes of output - // Count CRLF (2 bytes) for each line. - return n * 3 + (cutLines ? (n / maxLineLength) * 2 : 0); -} - - -size_t qpEncoder::getDecodedSize(const size_t n) const -{ - // Worst case: 1 byte of input equals 1 byte of output - return n; -} - - -} // encoder -} // utility -} // vmime diff --git a/src/utility/encoder/sevenBitEncoder.cpp b/src/utility/encoder/sevenBitEncoder.cpp deleted file mode 100644 index 7c76d73f..00000000 --- a/src/utility/encoder/sevenBitEncoder.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/encoder/sevenBitEncoder.hpp" - - -namespace vmime { -namespace utility { -namespace encoder { - - -sevenBitEncoder::sevenBitEncoder() -{ -} - - -} // encoder -} // utility -} // vmime diff --git a/src/utility/encoder/uuEncoder.cpp b/src/utility/encoder/uuEncoder.cpp deleted file mode 100644 index 0375a397..00000000 --- a/src/utility/encoder/uuEncoder.cpp +++ /dev/null @@ -1,344 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/encoder/uuEncoder.hpp" -#include "vmime/parserHelpers.hpp" - - -namespace vmime { -namespace utility { -namespace encoder { - - -uuEncoder::uuEncoder() -{ - getProperties()["mode"] = 644; - getProperties()["filename"] = "no_name"; - getProperties()["maxlinelength"] = 46; -} - - -const std::vector <string> uuEncoder::getAvailableProperties() const -{ - std::vector <string> list(encoder::getAvailableProperties()); - - list.push_back("maxlinelength"); - - list.push_back("mode"); - list.push_back("filename"); - - return (list); -} - - -// This is the character encoding function to make a character printable -static inline byte_t UUENCODE(const unsigned int c) -{ - return static_cast <byte_t>((c & 077) + ' '); -} - -// Single character decoding -static inline unsigned int UUDECODE(const unsigned int c) -{ - return (c - ' ') & 077; -} - - -size_t uuEncoder::encode(utility::inputStream& in, - utility::outputStream& out, utility::progressListener* progress) -{ - in.reset(); // may not work... - - const string propFilename = getProperties().getProperty <string>("filename", ""); - const string propMode = getProperties().getProperty <string>("mode", "644"); - - const size_t maxLineLength = - std::min(getProperties().getProperty <size_t>("maxlinelength", 46), static_cast <size_t>(46)); - - size_t total = 0; - size_t inTotal = 0; - - // Output the prelude text ("begin [mode] [filename]") - out << "begin"; - - if (!propFilename.empty()) - { - out << " " << propMode << " " << propFilename; - total += 2 + propMode.length() + propFilename.length(); - } - - out << "\r\n"; - total += 7; - - // Process the data - byte_t inBuffer[64]; - byte_t outBuffer[64]; - - if (progress) - progress->start(0); - - while (!in.eof()) - { - // Process up to 45 characters per line - std::fill(inBuffer, inBuffer + sizeof(inBuffer), 0); - - const size_t inLength = in.read(inBuffer, maxLineLength - 1); - - outBuffer[0] = UUENCODE(static_cast <unsigned int>(inLength)); // Line length - - size_t j = 1; - - for (size_t i = 0 ; i < inLength ; i += 3, j += 4) - { - const byte_t c1 = inBuffer[i]; - const byte_t c2 = inBuffer[i + 1]; - const byte_t c3 = inBuffer[i + 2]; - - outBuffer[j] = UUENCODE(c1 >> 2); - outBuffer[j + 1] = UUENCODE(((c1 << 4) & 060) | ((c2 >> 4) & 017)); - outBuffer[j + 2] = UUENCODE(((c2 << 2) & 074) | ((c3 >> 6) & 03)); - outBuffer[j + 3] = UUENCODE(c3 & 077); - } - - outBuffer[j] = '\r'; - outBuffer[j + 1] = '\n'; - - out.write(outBuffer, j + 2); - - total += j + 2; - inTotal += inLength; - - if (progress) - progress->progress(inTotal, inTotal); - } - - out << "end\r\n"; - total += 5; - - if (progress) - progress->stop(inTotal); - - return (total); -} - - -size_t uuEncoder::decode(utility::inputStream& in, - utility::outputStream& out, utility::progressListener* progress) -{ - in.reset(); // may not work... - - // Process the data - byte_t inBuffer[64]; - byte_t outBuffer[64]; - - size_t total = 0; - size_t inTotal = 0; - - bool stop = false; - - std::fill(inBuffer, inBuffer + sizeof(inBuffer), 0); - - if (progress) - progress->start(0); - - while (!stop && !in.eof()) - { - // Get the line length - byte_t lengthChar; - - if (in.read(&lengthChar, 1) == 0) - break; - - const size_t outLength = UUDECODE(lengthChar); - const size_t inLength = std::min((outLength * 4) / 3, static_cast <size_t>(64)); - size_t inPos = 0; - - switch (lengthChar) - { - case ' ': - case '\t': - case '\r': - case '\n': - { - // Ignore - continue; - } - case 'b': - { - // Read 5 characters more to check for begin ("begin ...\r\n" or "begin ...\n") - inPos = in.read(inBuffer, 5); - - if (inPos == 5 && - inBuffer[0] == 'e' && - inBuffer[1] == 'g' && - inBuffer[2] == 'i' && - inBuffer[3] == 'n' && - parserHelpers::isSpace(inBuffer[4])) - { - inTotal += 5; - - byte_t c = 0; - - size_t count = 0; - byte_t buffer[512]; - - while (count < sizeof(buffer) - 1 && in.read(&c, 1) == 1) - { - if (c == '\n') - break; - - buffer[count++] = c; - } - - inTotal += count; - - if (c != '\n') - { - // OOPS! Weird line. Don't try to decode more... - - if (progress) - progress->stop(inTotal); - - return (total); - } - - // Parse filename and mode - if (count > 0) - { - buffer[count] = '\0'; - - byte_t* p = buffer; - - while (*p && parserHelpers::isSpace(*p)) ++p; - - byte_t* modeStart = buffer; - - while (*p && !parserHelpers::isSpace(*p)) ++p; - - getResults()["mode"] = string(modeStart, p); - - while (*p && parserHelpers::isSpace(*p)) ++p; - - byte_t* filenameStart = buffer; - - while (*p && !(*p == '\r' || *p == '\n')) ++p; - - getResults()["filename"] = string(filenameStart, p); - } - // No filename or mode specified - else - { - getResults()["filename"] = "untitled"; - getResults()["mode"] = 644; - } - - continue; - } - - break; - } - case 'e': - { - // Read 3 characters more to check for end ("end\r\n" or "end\n") - inPos = in.read(inBuffer, 3); - - if (inPos == 3 && - inBuffer[0] == 'n' && - inBuffer[1] == 'd' && - (inBuffer[2] == '\r' || inBuffer[2] == '\n')) - { - stop = true; - inTotal += 3; - continue; - } - - break; - } - - } - - // Read encoded data - if (in.read(inBuffer + inPos, inLength - inPos) != inLength - inPos) - { - // Premature end of data - break; - } - - inTotal += (inLength - inPos); - - // Decode data - for (size_t i = 0, j = 0 ; i < inLength ; i += 4, j += 3) - { - const byte_t c1 = inBuffer[i]; - const byte_t c2 = inBuffer[i + 1]; - const byte_t c3 = inBuffer[i + 2]; - const byte_t c4 = inBuffer[i + 3]; - - const size_t n = std::min(inLength - i, static_cast <size_t>(3)); - - switch (n) - { - default: - case 3: outBuffer[j + 2] = static_cast <byte_t>(UUDECODE(c3) << 6 | UUDECODE(c4)); - case 2: outBuffer[j + 1] = static_cast <byte_t>(UUDECODE(c2) << 4 | UUDECODE(c3) >> 2); - case 1: outBuffer[j] = static_cast <byte_t>(UUDECODE(c1) << 2 | UUDECODE(c2) >> 4); - case 0: break; - } - - total += n; - } - - out.write(outBuffer, outLength); - - std::fill(inBuffer, inBuffer + sizeof(inBuffer), 0); - - if (progress) - progress->progress(inTotal, inTotal); - } - - if (progress) - progress->stop(inTotal); - - return (total); -} - - -size_t uuEncoder::getEncodedSize(const size_t n) const -{ - // 3 bytes of input provide 4 bytes of output. - // Count CRLF (2 bytes) for each line of 45 characters. - // Also reserve some space for header and footer. - return 200 + n * 3 + (n / 45) * 2; -} - - -size_t uuEncoder::getDecodedSize(const size_t n) const -{ - // 4 bytes of input provide 3 bytes of output - return (n * 3) / 4; -} - - -} // encoder -} // utility -} // vmime diff --git a/src/utility/filteredStream.cpp b/src/utility/filteredStream.cpp deleted file mode 100644 index bb705162..00000000 --- a/src/utility/filteredStream.cpp +++ /dev/null @@ -1,391 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/filteredStream.hpp" - -#include <algorithm> - - -namespace vmime { -namespace utility { - - -// filteredInputStream - -size_t filteredInputStream::getBlockSize() -{ - return std::min(inputStream::getBlockSize(), getPreviousInputStream().getBlockSize()); -} - - -// filteredOutputStream - -size_t filteredOutputStream::getBlockSize() -{ - return std::min(outputStream::getBlockSize(), getNextOutputStream().getBlockSize()); -} - - -// dotFilteredInputStream - -dotFilteredInputStream::dotFilteredInputStream(inputStream& is) - : m_stream(is), m_previousChar2('\0'), m_previousChar1('\0') -{ -} - - -inputStream& dotFilteredInputStream::getPreviousInputStream() -{ - return (m_stream); -} - - -bool dotFilteredInputStream::eof() const -{ - return (m_stream.eof()); -} - - -void dotFilteredInputStream::reset() -{ - m_previousChar2 = '\0'; - m_previousChar1 = '\0'; - - m_stream.reset(); -} - - -size_t dotFilteredInputStream::read(byte_t* const data, const size_t count) -{ - const size_t read = m_stream.read(data, count); - - const byte_t* readPtr = data; - byte_t* writePtr = data; - - const byte_t* end = data + read; - - size_t written = 0; - - // Replace "\n.." with "\n." - while (readPtr < end) - { - if (*readPtr == '.') - { - const byte_t prevChar2 = - (readPtr == data + 1 ? m_previousChar1 : - readPtr == data ? m_previousChar2 : *(readPtr - 2)); - const byte_t prevChar1 = - (readPtr == data ? m_previousChar1 : *(readPtr - 1)); - - if (prevChar2 == '\n' && prevChar1 == '.') - { - // Ignore last dot - } - else - { - *writePtr = *readPtr; - - ++writePtr; - ++written; - } - } - else - { - *writePtr = *readPtr; - - ++writePtr; - ++written; - } - - ++readPtr; - } - - m_previousChar2 = (read >= 2 ? data[read - 2] : m_previousChar1); - m_previousChar1 = (read >= 1 ? data[read - 1] : '\0'); - - return (written); -} - - -size_t dotFilteredInputStream::skip(const size_t /* count */) -{ - // Skipping bytes is not supported - return 0; -} - - -// dotFilteredOutputStream - -dotFilteredOutputStream::dotFilteredOutputStream(outputStream& os) - : m_stream(os), m_previousChar('\0'), m_start(true) -{ -} - - -outputStream& dotFilteredOutputStream::getNextOutputStream() -{ - return (m_stream); -} - - -void dotFilteredOutputStream::writeImpl - (const byte_t* const data, const size_t count) -{ - if (count == 0) - return; - - const byte_t* pos = data; - const byte_t* end = data + count; - const byte_t* start = data; - - if (m_previousChar == '.') - { - if (data[0] == '\n' || data[0] == '\r') - { - m_stream.write(".", 1); // extra <DOT> - m_stream.write(data, 1); - - pos = data + 1; - } - } - - // Replace "\n." with "\n.." - while ((pos = std::find(pos, end, '.')) != end) - { - const byte_t previousChar = - (pos == data ? m_previousChar : *(pos - 1)); - - if (previousChar == '\n') - { - m_stream.write(start, pos - start); - m_stream.write("..", 2); - - start = pos + 1; - } - else if (pos == data && m_start) // <DOT><CR><LF> at the beginning of content - { - m_stream.write(start, pos - start); - - if (pos + 1 < end && (*(pos + 1) == '\n' || *(pos + 1) == '\r')) - m_stream.write("..", 2); - else - m_stream.write(".", 1); - - start = pos + 1; - } - - ++pos; - } - - m_stream.write(start, end - start); - m_previousChar = data[count - 1]; - m_start = false; -} - - -void dotFilteredOutputStream::flush() -{ - // Do nothing - m_stream.flush(); -} - - -// CRLFToLFFilteredOutputStream - -CRLFToLFFilteredOutputStream::CRLFToLFFilteredOutputStream(outputStream& os) - : m_stream(os), m_previousChar('\0') -{ -} - - -outputStream& CRLFToLFFilteredOutputStream::getNextOutputStream() -{ - return (m_stream); -} - - -void CRLFToLFFilteredOutputStream::writeImpl - (const byte_t* const data, const size_t count) -{ - if (count == 0) - return; - - const byte_t* pos = data; - const byte_t* end = data + count; - const byte_t* start = data; - - // Warning: if the whole buffer finishes with '\r', this - // last character will not be written back if flush() is - // not called - if (m_previousChar == '\r') - { - if (*pos != '\n') - { - m_stream.write("\r", 1); // write back \r - m_previousChar = *pos; - } - } - - // Replace "\r\n" (CRLF) with "\n" (LF) - while ((pos = std::find(pos, end, '\n')) != end) - { - const byte_t previousChar = - (pos == data ? m_previousChar : *(pos - 1)); - - if (previousChar == '\r') - { - if (pos != start) - m_stream.write(start, pos - 1 - start); // do not write \r - - m_stream.write("\n", 1); - - start = pos + 1; - } - - ++pos; - } - - if (data[count - 1] == '\r') - { - m_stream.write(start, end - start - 1); - m_previousChar = '\r'; - } - else - { - m_stream.write(start, end - start); - m_previousChar = data[count - 1]; - } -} - - -void CRLFToLFFilteredOutputStream::flush() -{ - m_stream.flush(); - - // TODO -} - - -// LFToCRLFFilteredOutputStream - -LFToCRLFFilteredOutputStream::LFToCRLFFilteredOutputStream(outputStream& os) - : m_stream(os), m_previousChar('\0') -{ -} - - -outputStream& LFToCRLFFilteredOutputStream::getNextOutputStream() -{ - return (m_stream); -} - - -void LFToCRLFFilteredOutputStream::writeImpl - (const byte_t* const data, const size_t count) -{ - if (count == 0) - return; - - string buffer; - buffer.reserve(count); - - const byte_t* pos = data; - const byte_t* end = data + count; - - byte_t previousChar = m_previousChar; - - while (pos < end) - { - switch (*pos) - { - case '\r': - - buffer.append(1, '\r'); - buffer.append(1, '\n'); - - break; - - case '\n': - - if (previousChar != '\r') - { - buffer.append(1, '\r'); - buffer.append(1, '\n'); - } - - break; - - default: - - buffer.append(1, *pos); - break; - } - - previousChar = *pos; - ++pos; - } - - m_stream.write(&buffer[0], buffer.length()); - - m_previousChar = previousChar; -} - - -void LFToCRLFFilteredOutputStream::flush() -{ - m_stream.flush(); -} - - -// stopSequenceFilteredInputStream <1> - -template <> -size_t stopSequenceFilteredInputStream <1>::read - (byte_t* const data, const size_t count) -{ - if (eof() || m_stream.eof()) - { - m_eof = true; - return 0; - } - - const size_t read = m_stream.read(data, count); - byte_t* end = data + read; - - byte_t* pos = std::find(data, end, m_sequence[0]); - - if (pos == end) - { - return (read); - } - else - { - m_found = 1; - return (pos - data); - } -} - - -} // utility -} // vmime - diff --git a/src/utility/inputStream.cpp b/src/utility/inputStream.cpp deleted file mode 100644 index a7d6bc0f..00000000 --- a/src/utility/inputStream.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/inputStream.hpp" - - -namespace vmime { -namespace utility { - - -} // utility -} // vmime - diff --git a/src/utility/inputStreamAdapter.cpp b/src/utility/inputStreamAdapter.cpp deleted file mode 100644 index c0b06be4..00000000 --- a/src/utility/inputStreamAdapter.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/inputStreamAdapter.hpp" - - -namespace vmime { -namespace utility { - - -inputStreamAdapter::inputStreamAdapter(std::istream& is) - : m_stream(is) -{ -} - - -bool inputStreamAdapter::eof() const -{ - return (m_stream.eof()); -} - - -void inputStreamAdapter::reset() -{ - m_stream.exceptions(std::ios_base::badbit); - m_stream.seekg(0, std::ios::beg); - m_stream.clear(); -} - - -size_t inputStreamAdapter::read - (byte_t* const data, const size_t count) -{ - m_stream.exceptions(std::ios_base::badbit); - m_stream.read(reinterpret_cast <char*>(data), count); - return (m_stream.gcount()); -} - - -size_t inputStreamAdapter::skip(const size_t count) -{ - m_stream.exceptions(std::ios_base::badbit); - m_stream.ignore(count); - return (m_stream.gcount()); -} - - -size_t inputStreamAdapter::getPosition() const -{ - return m_stream.tellg(); -} - - -void inputStreamAdapter::seek(const size_t pos) -{ - m_stream.clear(); - m_stream.seekg(pos, std::ios_base::beg); -} - - -} // utility -} // vmime - diff --git a/src/utility/inputStreamByteBufferAdapter.cpp b/src/utility/inputStreamByteBufferAdapter.cpp deleted file mode 100644 index c270ea56..00000000 --- a/src/utility/inputStreamByteBufferAdapter.cpp +++ /dev/null @@ -1,103 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/inputStreamByteBufferAdapter.hpp" - - -namespace vmime { -namespace utility { - - -inputStreamByteBufferAdapter::inputStreamByteBufferAdapter(const byte_t* buffer, const size_t length) - : m_buffer(buffer), m_length(length), m_pos(0) -{ -} - - -bool inputStreamByteBufferAdapter::eof() const -{ - return m_pos >= m_length; -} - - -void inputStreamByteBufferAdapter::reset() -{ - m_pos = 0; -} - - -size_t inputStreamByteBufferAdapter::read - (byte_t* const data, const size_t count) -{ - const size_t remaining = m_length - m_pos; - - if (remaining < count) - { - std::copy(m_buffer + m_pos, m_buffer + m_pos + remaining, data); - m_pos += remaining; - - return remaining; - } - else - { - std::copy(m_buffer + m_pos, m_buffer + m_pos + count, data); - m_pos += count; - - return count; - } -} - - -size_t inputStreamByteBufferAdapter::skip(const size_t count) -{ - const size_t remaining = m_length - m_pos; - - if (remaining < count) - { - m_pos += remaining; - return remaining; - } - else - { - m_pos += count; - return count; - } -} - - -size_t inputStreamByteBufferAdapter::getPosition() const -{ - return m_pos; -} - - -void inputStreamByteBufferAdapter::seek(const size_t pos) -{ - if (pos <= m_length) - m_pos = pos; -} - - -} // utility -} // vmime - diff --git a/src/utility/inputStreamPointerAdapter.cpp b/src/utility/inputStreamPointerAdapter.cpp deleted file mode 100644 index 6bf0461a..00000000 --- a/src/utility/inputStreamPointerAdapter.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/inputStreamPointerAdapter.hpp" - - -namespace vmime { -namespace utility { - - -inputStreamPointerAdapter::inputStreamPointerAdapter(std::istream* is, const bool own) - : inputStreamAdapter(*is), m_stream(is), m_own(own) -{ -} - - -inputStreamPointerAdapter::~inputStreamPointerAdapter() -{ - if (m_own) - delete (m_stream); -} - - -} // utility -} // vmime - diff --git a/src/utility/inputStreamSocketAdapter.cpp b/src/utility/inputStreamSocketAdapter.cpp deleted file mode 100644 index d78855eb..00000000 --- a/src/utility/inputStreamSocketAdapter.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/inputStreamSocketAdapter.hpp" - - -#if VMIME_HAVE_MESSAGING_FEATURES - - -#include "vmime/net/socket.hpp" - - -namespace vmime { -namespace utility { - - -inputStreamSocketAdapter::inputStreamSocketAdapter(net::socket& sok) - : m_socket(sok) -{ -} - - -bool inputStreamSocketAdapter::eof() const -{ - // Can't know... - return false; -} - - -void inputStreamSocketAdapter::reset() -{ - // Not supported -} - - -size_t inputStreamSocketAdapter::read - (byte_t* const data, const size_t count) -{ - return m_socket.receiveRaw(data, count); -} - - -size_t inputStreamSocketAdapter::skip - (const size_t /* count */) -{ - // Not supported - return 0; -} - - -size_t inputStreamSocketAdapter::getBlockSize() -{ - return m_socket.getBlockSize(); -} - - -} // utility -} // vmime - - -#endif // VMIME_HAVE_MESSAGING_FEATURES - diff --git a/src/utility/inputStreamStringAdapter.cpp b/src/utility/inputStreamStringAdapter.cpp deleted file mode 100644 index 9b897b97..00000000 --- a/src/utility/inputStreamStringAdapter.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/inputStreamStringAdapter.hpp" - - -namespace vmime { -namespace utility { - - -inputStreamStringAdapter::inputStreamStringAdapter(const string& buffer) - : m_buffer(buffer), m_begin(0), m_end(buffer.length()), m_pos(0) -{ -} - - -inputStreamStringAdapter::inputStreamStringAdapter(const string& buffer, - const size_t begin, const size_t end) - : m_buffer(buffer), m_begin(begin), m_end(end), m_pos(begin) -{ -} - - -bool inputStreamStringAdapter::eof() const -{ - return (m_pos >= m_end); -} - - -void inputStreamStringAdapter::reset() -{ - m_pos = m_begin; -} - - -size_t inputStreamStringAdapter::read - (byte_t* const data, const size_t count) -{ - if (m_pos + count >= m_end) - { - const size_t remaining = m_end - m_pos; - - std::copy(m_buffer.begin() + m_pos, m_buffer.end(), data); - m_pos = m_end; - return (remaining); - } - else - { - std::copy(m_buffer.begin() + m_pos, m_buffer.begin() + m_pos + count, data); - m_pos += count; - return (count); - } -} - - -size_t inputStreamStringAdapter::skip(const size_t count) -{ - if (m_pos + count >= m_end) - { - const size_t remaining = m_end - m_pos; - m_pos = m_end; - return (remaining); - } - else - { - m_pos += count; - return (count); - } -} - - -size_t inputStreamStringAdapter::getPosition() const -{ - return m_pos - m_begin; -} - - -void inputStreamStringAdapter::seek(const size_t pos) -{ - if (m_begin + pos <= m_end) - m_pos = m_begin + pos; -} - - -} // utility -} // vmime - diff --git a/src/utility/inputStreamStringProxyAdapter.cpp b/src/utility/inputStreamStringProxyAdapter.cpp deleted file mode 100644 index 5513de80..00000000 --- a/src/utility/inputStreamStringProxyAdapter.cpp +++ /dev/null @@ -1,102 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/inputStreamStringProxyAdapter.hpp" -#include "vmime/utility/stringProxy.hpp" - - -namespace vmime { -namespace utility { - - -inputStreamStringProxyAdapter::inputStreamStringProxyAdapter(const stringProxy& buffer) - : m_buffer(buffer), m_pos(0) -{ -} - - -bool inputStreamStringProxyAdapter::eof() const -{ - return (m_pos >= m_buffer.length()); -} - - -void inputStreamStringProxyAdapter::reset() -{ - m_pos = 0; -} - - -size_t inputStreamStringProxyAdapter::read - (byte_t* const data, const size_t count) -{ - const size_t remaining = m_buffer.length() - m_pos; - - if (count > remaining) - { - std::copy(m_buffer.it_begin() + m_pos, m_buffer.it_end(), data); - m_pos = m_buffer.length(); - return (remaining); - } - else - { - std::copy(m_buffer.it_begin() + m_pos, m_buffer.it_begin() + m_pos + count, data); - m_pos += count; - return (count); - } -} - - -size_t inputStreamStringProxyAdapter::skip(const size_t count) -{ - const size_t remaining = m_buffer.length() - m_pos; - - if (count > remaining) - { - m_pos = m_buffer.length(); - return (remaining); - } - else - { - m_pos += count; - return (count); - } -} - - -size_t inputStreamStringProxyAdapter::getPosition() const -{ - return m_pos; -} - - -void inputStreamStringProxyAdapter::seek(const size_t pos) -{ - if (pos <= m_buffer.length()) - m_pos = pos; -} - - -} // utility -} // vmime - diff --git a/src/utility/outputStream.cpp b/src/utility/outputStream.cpp deleted file mode 100644 index 070e28c5..00000000 --- a/src/utility/outputStream.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/outputStream.hpp" - - -namespace vmime { -namespace utility { - - -void outputStream::write(const byte_t* const data, const size_t count) -{ - writeImpl(data, count); -} - - -void outputStream::write(const char* const data, const size_t count) -{ - writeImpl(reinterpret_cast <const byte_t*>(data), count); -} - - -} // utility -} // vmime - diff --git a/src/utility/outputStreamAdapter.cpp b/src/utility/outputStreamAdapter.cpp deleted file mode 100644 index ed90c7d3..00000000 --- a/src/utility/outputStreamAdapter.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/outputStreamAdapter.hpp" - - -namespace vmime { -namespace utility { - - -outputStreamAdapter::outputStreamAdapter(std::ostream& os) - : m_stream(os) -{ -} - - -void outputStreamAdapter::writeImpl - (const byte_t* const data, const size_t count) -{ - m_stream.exceptions(std::ios_base::badbit); - m_stream.write(reinterpret_cast <const char*>(data), count); -} - - -void outputStreamAdapter::flush() -{ - m_stream.exceptions(std::ios_base::badbit); - m_stream.flush(); -} - - -} // utility -} // vmime - diff --git a/src/utility/outputStreamByteArrayAdapter.cpp b/src/utility/outputStreamByteArrayAdapter.cpp deleted file mode 100644 index 1bed735b..00000000 --- a/src/utility/outputStreamByteArrayAdapter.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/outputStreamByteArrayAdapter.hpp" - - -namespace vmime { -namespace utility { - - -outputStreamByteArrayAdapter::outputStreamByteArrayAdapter(byteArray& array) - : m_array(array) -{ -} - - -void outputStreamByteArrayAdapter::writeImpl - (const byte_t* const data, const size_t count) -{ - m_array.insert(m_array.end(), data, data + count); -} - - -void outputStreamByteArrayAdapter::flush() -{ - // Do nothing -} - - -} // utility -} // vmime - diff --git a/src/utility/outputStreamSocketAdapter.cpp b/src/utility/outputStreamSocketAdapter.cpp deleted file mode 100644 index 03194497..00000000 --- a/src/utility/outputStreamSocketAdapter.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/outputStreamSocketAdapter.hpp" - - -#if VMIME_HAVE_MESSAGING_FEATURES - - -#include "vmime/net/socket.hpp" - - -namespace vmime { -namespace utility { - - -outputStreamSocketAdapter::outputStreamSocketAdapter(net::socket& sok) - : m_socket(sok) -{ -} - - -void outputStreamSocketAdapter::writeImpl - (const byte_t* const data, const size_t count) -{ - m_socket.sendRaw(data, count); -} - - -void outputStreamSocketAdapter::flush() -{ - // Do nothing -} - - -size_t outputStreamSocketAdapter::getBlockSize() -{ - return m_socket.getBlockSize(); -} - - - -} // utility -} // vmime - - -#endif // VMIME_HAVE_MESSAGING_FEATURES - diff --git a/src/utility/outputStreamStringAdapter.cpp b/src/utility/outputStreamStringAdapter.cpp deleted file mode 100644 index 7105480c..00000000 --- a/src/utility/outputStreamStringAdapter.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/outputStreamStringAdapter.hpp" - -#include "vmime/utility/stringUtils.hpp" - - -namespace vmime { -namespace utility { - - -outputStreamStringAdapter::outputStreamStringAdapter(string& buffer) - : m_buffer(buffer) -{ -} - - -void outputStreamStringAdapter::writeImpl - (const byte_t* const data, const size_t count) -{ - vmime::utility::stringUtils::appendBytesToString(m_buffer, data, count); -} - - -void outputStreamStringAdapter::flush() -{ - // Do nothing -} - - -} // utility -} // vmime - diff --git a/src/utility/parserInputStreamAdapter.cpp b/src/utility/parserInputStreamAdapter.cpp deleted file mode 100644 index 5ab26ef0..00000000 --- a/src/utility/parserInputStreamAdapter.cpp +++ /dev/null @@ -1,176 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/parserInputStreamAdapter.hpp" - - -namespace vmime { -namespace utility { - - -parserInputStreamAdapter::parserInputStreamAdapter(shared_ptr <seekableInputStream> stream) - : m_stream(stream) -{ -} - - -bool parserInputStreamAdapter::eof() const -{ - return m_stream->eof(); -} - - -void parserInputStreamAdapter::reset() -{ - m_stream->reset(); -} - - -size_t parserInputStreamAdapter::read - (byte_t* const data, const size_t count) -{ - return m_stream->read(data, count); -} - - -shared_ptr <seekableInputStream> parserInputStreamAdapter::getUnderlyingStream() -{ - return m_stream; -} - - -const string parserInputStreamAdapter::extract(const size_t begin, const size_t end) const -{ - const size_t initialPos = m_stream->getPosition(); - - byte_t *buffer = NULL; - - try - { - buffer = new byte_t[end - begin + 1]; - - m_stream->seek(begin); - - const size_t readBytes = m_stream->read(buffer, end - begin); - buffer[readBytes] = '\0'; - - m_stream->seek(initialPos); - - string str(buffer, buffer + readBytes); - delete [] buffer; - - return str; - } - catch (...) - { - delete [] buffer; - - m_stream->seek(initialPos); - throw; - } -} - - -size_t parserInputStreamAdapter::findNext - (const string& token, const size_t startPosition) -{ - static const unsigned int BUFFER_SIZE = 4096; - - // Token must not be longer than BUFFER_SIZE/2 - if (token.empty() || token.length() > BUFFER_SIZE / 2) - return npos; - - const size_t initialPos = getPosition(); - - seek(startPosition); - - try - { - byte_t findBuffer[BUFFER_SIZE]; - byte_t* findBuffer1 = findBuffer; - byte_t* findBuffer2 = findBuffer + (BUFFER_SIZE / 2); - - size_t findBufferLen = 0; - size_t findBufferOffset = 0; - - bool isEOF = false; - - // Fill in initial buffer - findBufferLen = read(findBuffer, BUFFER_SIZE); - - while (findBufferLen != 0) - { - // Find token - for (byte_t *begin = findBuffer, *end = findBuffer + findBufferLen - token.length() ; - begin <= end ; ++begin) - { - if (begin[0] == token[0] && - (token.length() == 1 || - memcmp(static_cast <const void *>(&begin[1]), - static_cast <const void *>(token.data() + 1), - token.length() - 1) == 0)) - { - seek(initialPos); - return startPosition + findBufferOffset + (begin - findBuffer); - } - } - - // Rotate buffer - memcpy(findBuffer1, findBuffer2, (BUFFER_SIZE / 2)); - - // Read more bytes - if (findBufferLen < BUFFER_SIZE && (eof() || isEOF)) - { - break; - } - else - { - const size_t bytesRead = read(findBuffer2, BUFFER_SIZE / 2); - - if (bytesRead == 0) - { - isEOF = true; - } - else - { - findBufferLen = (BUFFER_SIZE / 2) + bytesRead; - findBufferOffset += (BUFFER_SIZE / 2); - } - } - } - - seek(initialPos); - } - catch (...) - { - seek(initialPos); - throw; - } - - return npos; -} - - -} // utility -} // vmime - diff --git a/src/utility/path.cpp b/src/utility/path.cpp deleted file mode 100644 index 9f746d54..00000000 --- a/src/utility/path.cpp +++ /dev/null @@ -1,266 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/path.hpp" - -#include <algorithm> - - -namespace vmime { -namespace utility { - - -path::path() -{ -} - - -path::path(const component& c) -{ - m_list.push_back(c); -} - - -path::path(const path& p) - : object() -{ - m_list.resize(p.m_list.size()); - std::copy(p.m_list.begin(), p.m_list.end(), m_list.begin()); -} - - -path::path(const string& s) -{ - m_list.push_back(component(s)); -} - - -path path::operator/(const path& p) const -{ - path pr(*this); - pr /= p; - - return (pr); -} - - -path path::operator/(const component& c) const -{ - path pr(*this); - pr /= c; - - return (pr); -} - - -path& path::operator/=(const path& p) -{ - const list::size_type size = m_list.size(); - - m_list.resize(size + p.m_list.size()); - std::copy(p.m_list.begin(), p.m_list.end(), m_list.begin() + size); - - return (*this); -} - - -path& path::operator/=(const component& c) -{ - m_list.push_back(c); - return (*this); -} - - -path path::getParent() const -{ - path p; - - if (!isEmpty()) - { - p.m_list.resize(m_list.size() - 1); - std::copy(m_list.begin(), m_list.end() - 1, p.m_list.begin()); - } - - return (p); -} - - -path& path::operator=(const path& p) -{ - m_list.resize(p.m_list.size()); - std::copy(p.m_list.begin(), p.m_list.end(), m_list.begin()); - - return (*this); -} - - -path& path::operator=(const component& c) -{ - m_list.resize(1); - m_list[0] = c; - - return (*this); -} - - -bool path::operator==(const path& p) const -{ - if (m_list.size() != p.m_list.size()) - return (false); - - list::const_iterator i = m_list.begin(); - list::const_iterator j = p.m_list.begin(); - - bool equal = true; - - for ( ; equal && i != m_list.end() ; ++i, ++j) - //equal = (*i == *j); - equal = ((*i).getBuffer() == (*j).getBuffer()); - - return (equal); -} - - -bool path::operator!=(const path& p) const -{ - return (!(*this == p)); -} - - -bool path::isEmpty() const -{ - return (m_list.empty()); -} - - -bool path::isRoot() const -{ - return (m_list.empty()); -} - - -const path::component path::getLastComponent() const -{ - return (m_list[m_list.size() - 1]); -} - - -path::component& path::getLastComponent() -{ - return (m_list[m_list.size() - 1]); -} - - -size_t path::getSize() const -{ - return (m_list.size()); -} - - -const path::component& path::operator[](const size_t x) const -{ - return (m_list[x]); -} - - -path::component& path::operator[](const size_t x) -{ - return (m_list[x]); -} - - -bool path::isDirectParentOf(const path& p) const -{ - if (p.getSize() != getSize() + 1) - return (false); - - bool equal = true; - - for (list::size_type i = 0 ; equal && i < m_list.size() ; ++i) - equal = (m_list[i] == p.m_list[i]); - - return (equal); -} - - -bool path::isParentOf(const path& p) const -{ - if (p.getSize() < getSize() + 1) - return (false); - - bool equal = true; - - for (list::size_type i = 0 ; equal && i < m_list.size() ; ++i) - equal = (m_list[i] == p.m_list[i]); - - return (equal); -} - - -void path::renameParent(const path& oldPath, const path& newPath) -{ - if (isEmpty() || oldPath.getSize() > getSize()) - return; - - bool equal = true; - list::size_type i; - - for (i = 0 ; equal && i < oldPath.m_list.size() ; ++i) - equal = (m_list[i] == oldPath.m_list[i]); - - if (i != oldPath.m_list.size()) - return; - - list newList; - - for (list::size_type j = 0 ; j < newPath.m_list.size() ; ++j) - newList.push_back(newPath.m_list[j]); - - for (list::size_type j = i ; j < m_list.size() ; ++j) - newList.push_back(m_list[j]); - - m_list.resize(newList.size()); - std::copy(newList.begin(), newList.end(), m_list.begin()); -} - - -void path::appendComponent(const path::component& c) -{ - m_list.push_back(c); -} - - -const path::component& path::getComponentAt(const size_t pos) const -{ - return (m_list[pos]); -} - - -path::component& path::getComponentAt(const size_t pos) -{ - return (m_list[pos]); -} - - -} // utility -} // vmime diff --git a/src/utility/progressListener.cpp b/src/utility/progressListener.cpp deleted file mode 100644 index cef074e5..00000000 --- a/src/utility/progressListener.cpp +++ /dev/null @@ -1,79 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/progressListener.hpp" - - -namespace vmime { -namespace utility { - - -// progressListenerSizeAdapter - -progressListenerSizeAdapter::progressListenerSizeAdapter - (progressListener* list, const size_t total) - : m_wrapped(list), m_total(total) -{ -} - - -bool progressListenerSizeAdapter::cancel() const -{ - return (m_wrapped ? m_wrapped->cancel() : false); -} - - -void progressListenerSizeAdapter::start(const size_t predictedTotal) -{ - if (m_wrapped) - m_wrapped->start(predictedTotal); -} - - -void progressListenerSizeAdapter::progress(const size_t current, const size_t currentTotal) -{ - if (m_wrapped) - { - if (currentTotal > m_total) - m_total = currentTotal; - - m_wrapped->progress(current, m_total); - } -} - - -void progressListenerSizeAdapter::stop(const size_t total) -{ - if (m_wrapped) - { - if (total > m_total) - m_total = total; - - m_wrapped->stop(m_total); - } -} - - -} // utility -} // vmime - diff --git a/src/utility/random.cpp b/src/utility/random.cpp deleted file mode 100644 index 97d12ddc..00000000 --- a/src/utility/random.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/random.hpp" -#include "vmime/platform.hpp" - -#include <ctime> - - -namespace vmime { -namespace utility { - - -static unsigned int getRandomSeed() -{ - unsigned int seed; - - platform::getHandler()->generateRandomBytes - (reinterpret_cast <unsigned char*>(&seed), sizeof(seed)); - - return seed; -} - - -unsigned int random::getNext() -{ - static unsigned int next = getRandomSeed(); - - // Park and Miller's minimal standard generator: - // xn+1 = (a * xn + b) mod c - // xn+1 = (16807 * xn) mod (2^31 - 1) - next = static_cast<unsigned int>((16807 * next) % 2147483647ul); - return next; -} - - -unsigned int random::getTime() -{ - return static_cast <unsigned int>((platform::getHandler()->getUnixTime())); -} - - -unsigned int random::getProcess() -{ - return (platform::getHandler()->getProcessId()); -} - - -const string random::getString(const size_t length, const string& randomChars) -{ - string res; - res.resize(length); - - const unsigned int x = static_cast <unsigned int>(randomChars.length()); - size_t c = 0; - - while (c < length) - { - for (unsigned int n = random::getNext() ; n != 0 && c < length ; n /= x) - { - res[c++] = randomChars[n % x]; - } - } - - return (res); -} - - -} // utility -} // vmime diff --git a/src/utility/seekableInputStreamRegionAdapter.cpp b/src/utility/seekableInputStreamRegionAdapter.cpp deleted file mode 100644 index cede1ba9..00000000 --- a/src/utility/seekableInputStreamRegionAdapter.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/seekableInputStreamRegionAdapter.hpp" - - -namespace vmime { -namespace utility { - - -seekableInputStreamRegionAdapter::seekableInputStreamRegionAdapter - (shared_ptr <seekableInputStream> stream, const size_t begin, const size_t length) - : m_stream(stream), m_begin(begin), m_length(length), m_position(0) -{ -} - - -bool seekableInputStreamRegionAdapter::eof() const -{ - return m_position >= m_length; -} - - -void seekableInputStreamRegionAdapter::reset() -{ - m_position = 0; -} - - -size_t seekableInputStreamRegionAdapter::read - (byte_t* const data, const size_t count) -{ - m_stream->seek(m_begin + m_position); - - size_t readBytes = 0; - - if (m_position + count >= m_length) - { - const size_t remaining = m_length - m_position; - readBytes = m_stream->read(data, remaining); - } - else - { - readBytes = m_stream->read(data, count); - } - - m_position += readBytes; - - return readBytes; -} - - -size_t seekableInputStreamRegionAdapter::skip(const size_t count) -{ - if (m_position + count >= m_length) - { - const size_t remaining = m_length - m_position; - m_position += remaining; - return remaining; - } - else - { - m_position += count; - return count; - } -} - - -size_t seekableInputStreamRegionAdapter::getPosition() const -{ - return m_position; -} - - -void seekableInputStreamRegionAdapter::seek(const size_t pos) -{ - if (pos > m_length) - m_position = m_length; - else - m_position = pos; -} - - -} // utility -} // vmime - diff --git a/src/utility/stream.cpp b/src/utility/stream.cpp deleted file mode 100644 index 232b23c7..00000000 --- a/src/utility/stream.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/stream.hpp" - - - -namespace vmime { -namespace utility { - - -size_t stream::getBlockSize() -{ - return 32768; // 32 KB -} - - -} // utility -} // vmime - diff --git a/src/utility/streamUtils.cpp b/src/utility/streamUtils.cpp deleted file mode 100644 index f3cc69ef..00000000 --- a/src/utility/streamUtils.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/streamUtils.hpp" - -#include <algorithm> // for std::copy -#include <iterator> // for std::back_inserter - - - -namespace vmime { -namespace utility { - - -outputStream& operator<<(outputStream& os, const byte_t c) -{ - os.write(&c, 1); - return (os); -} - - -outputStream& operator<<(outputStream& os, const string& str) -{ - os.write(str.data(), str.length()); - return (os); -} - - -size_t bufferedStreamCopy(inputStream& is, outputStream& os) -{ - return bufferedStreamCopy(is, os, 0, NULL); -} - - -size_t bufferedStreamCopyRange(inputStream& is, outputStream& os, - const size_t start, const size_t length) -{ - const size_t blockSize = - std::min(is.getBlockSize(), os.getBlockSize()); - - is.skip(start); - - std::vector <byte_t> vbuffer(blockSize); - - byte_t* buffer = &vbuffer.front(); - size_t total = 0; - - while (!is.eof() && total < length) - { - const size_t remaining = std::min(length - total, blockSize); - const size_t read = is.read(buffer, remaining); - - if (read != 0) - { - os.write(buffer, read); - total += read; - } - } - - return total; -} - - -size_t bufferedStreamCopy(inputStream& is, outputStream& os, - const size_t length, progressListener* progress) -{ - const size_t blockSize = - std::min(is.getBlockSize(), os.getBlockSize()); - - std::vector <byte_t> vbuffer(blockSize); - - byte_t* buffer = &vbuffer.front(); - size_t total = 0; - - if (progress != NULL) - progress->start(length); - - while (!is.eof()) - { - const size_t read = is.read(buffer, blockSize); - - if (read != 0) - { - os.write(buffer, read); - total += read; - - if (progress != NULL) - progress->progress(total, std::max(total, length)); - } - } - - if (progress != NULL) - progress->stop(total); - - return (total); -} - - -} // utility -} // vmime - diff --git a/src/utility/stringProxy.cpp b/src/utility/stringProxy.cpp deleted file mode 100644 index 67c96816..00000000 --- a/src/utility/stringProxy.cpp +++ /dev/null @@ -1,151 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/stringProxy.hpp" - -#include "vmime/utility/outputStreamAdapter.hpp" - -#include <iterator> -#include <algorithm> - - -namespace vmime { -namespace utility { - - -stringProxy::stringProxy() - : m_start(0), m_end(0) -{ -} - - -stringProxy::stringProxy(const stringProxy& s) - : m_buffer(s.m_buffer), m_start(s.m_start), m_end(s.m_end) -{ -} - - -stringProxy::stringProxy(const string& s, const size_t start, const size_t end) - : m_buffer(s), m_start(start), - m_end(end == std::numeric_limits <size_t>::max() ? s.length() : end) -{ -} - - -void stringProxy::set(const string& s, const size_t start, const size_t end) -{ - m_buffer = s; - m_start = start; - - if (end == std::numeric_limits <size_t>::max()) - m_end = s.length(); - else - m_end = end; -} - - -void stringProxy::detach() -{ - m_buffer.clear(); - m_start = m_end = 0; -} - - -stringProxy& stringProxy::operator=(const stringProxy& s) -{ - m_buffer = s.m_buffer; - m_start = s.m_start; - m_end = s.m_end; - - return (*this); -} - - -stringProxy& stringProxy::operator=(const string& s) -{ - m_buffer = s; - m_start = 0; - m_end = s.length(); - - return (*this); -} - - -void stringProxy::extract(outputStream& os, const size_t start, const size_t end, - utility::progressListener* progress) const -{ - size_t len = 0; - - if (end == std::numeric_limits <size_t>::max()) - len = m_end - start - m_start; - else if (end > start) - len = end - start; - - if (progress) - progress->start(len); - - os.write(m_buffer.data() + m_start + start, len); - - if (progress) - { - progress->progress(len, len); - progress->stop(len); - } -} - - -size_t stringProxy::length() const -{ - return (m_end - m_start); -} - - -size_t stringProxy::start() const -{ - return (m_start); -} - - -size_t stringProxy::end() const -{ - return (m_end); -} - - -std::ostream& operator<<(std::ostream& os, const stringProxy& s) -{ - outputStreamAdapter adapter(os); - s.extract(adapter); - return (os); -} - - -outputStream& operator<<(outputStream& os, const stringProxy& s) -{ - s.extract(os); - return (os); -} - - -} // utility -} // vmime diff --git a/src/utility/stringUtils.cpp b/src/utility/stringUtils.cpp deleted file mode 100644 index dd99d845..00000000 --- a/src/utility/stringUtils.cpp +++ /dev/null @@ -1,242 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/stringUtils.hpp" -#include "vmime/parserHelpers.hpp" - - -namespace vmime { -namespace utility { - - -bool stringUtils::isStringEqualNoCase - (const string& s1, const char* s2, const size_t n) -{ - // 'n' is the number of characters to compare - // 's2' must be in lowercase letters only - if (s1.length() < n) - return (false); - - const std::ctype <char>& fac = - std::use_facet <std::ctype <char> >(std::locale::classic()); - - bool equal = true; - - for (size_t i = 0 ; equal && i < n ; ++i) - equal = (fac.tolower(static_cast <unsigned char>(s1[i])) == s2[i]); - - return (equal); -} - - -bool stringUtils::isStringEqualNoCase(const string& s1, const string& s2) -{ - if (s1.length() != s2.length()) - return (false); - - const std::ctype <char>& fac = - std::use_facet <std::ctype <char> >(std::locale::classic()); - - bool equal = true; - const string::const_iterator end = s1.end(); - - for (string::const_iterator i = s1.begin(), j = s2.begin(); i != end ; ++i, ++j) - equal = (fac.tolower(static_cast <unsigned char>(*i)) == fac.tolower(static_cast <unsigned char>(*j))); - - return (equal); -} - - -bool stringUtils::isStringEqualNoCase - (const string::const_iterator begin, const string::const_iterator end, - const char* s, const size_t n) -{ - if (static_cast <size_t>(end - begin) < n) - return (false); - - const std::ctype <char>& fac = - std::use_facet <std::ctype <char> >(std::locale::classic()); - - bool equal = true; - char* c = const_cast<char*>(s); - size_t r = n; - - for (string::const_iterator i = begin ; equal && r && *c ; ++i, ++c, --r) - equal = (fac.tolower(static_cast <unsigned char>(*i)) == static_cast <unsigned char>(*c)); - - return (r == 0 && equal); -} - - -const string stringUtils::toLower(const string& str) -{ - const std::ctype <char>& fac = - std::use_facet <std::ctype <char> >(std::locale::classic()); - - string out; - out.resize(str.size()); - - for (size_t i = 0, len = str.length() ; i < len ; ++i) - out[i] = fac.tolower(static_cast <unsigned char>(str[i])); - - return out; -} - - -const string stringUtils::toUpper(const string& str) -{ - const std::ctype <char>& fac = - std::use_facet <std::ctype <char> >(std::locale::classic()); - - string out; - out.resize(str.size()); - - for (size_t i = 0, len = str.length() ; i < len ; ++i) - out[i] = fac.toupper(static_cast <unsigned char>(str[i])); - - return out; -} - - -const string stringUtils::trim(const string& str) -{ - string::const_iterator b = str.begin(); - string::const_iterator e = str.end(); - - if (b != e) - { - for ( ; b != e && parserHelpers::isSpace(*b) ; ++b) {} - for ( ; e != b && parserHelpers::isSpace(*(e - 1)) ; --e) {} - } - - return (string(b, e)); -} - - -size_t stringUtils::countASCIIchars - (const string::const_iterator begin, const string::const_iterator end) -{ - size_t count = 0; - - for (string::const_iterator i = begin ; i != end ; ++i) - { - if (parserHelpers::isAscii(*i)) - { - if (*i != '=' || ((i + 1) != end && *(i + 1) != '?')) // To avoid bad behaviour... - ++count; - } - } - - return (count); -} - - -bool stringUtils::is7bit(const string& str) -{ - return countASCIIchars(str.begin(), str.end()) == str.length(); -} - - -size_t stringUtils::findFirstNonASCIIchar - (const string::const_iterator begin, const string::const_iterator end) -{ - size_t pos = string::npos; - - for (string::const_iterator i = begin ; i != end ; ++i) - { - if (!parserHelpers::isAscii(*i)) - { - pos = i - begin; - break; - } - } - - return pos; -} - - -const string stringUtils::unquote(const string& str) -{ - if (str.length() < 2) - return str; - - if (str[0] != '"' || str[str.length() - 1] != '"') - return str; - - string res; - res.reserve(str.length()); - - bool escaped = false; - - for (string::const_iterator it = str.begin() + 1, end = str.end() - 1 ; it != end ; ++it) - { - const char c = *it; - - if (escaped) - { - res += c; - escaped = false; - } - else if (!escaped && c == '\\') - { - escaped = true; - } - else - { - res += c; - } - } - - return res; -} - - -bool stringUtils::needQuoting(const string& str, const string& specialChars) -{ - return str.find_first_of(specialChars.c_str()) != string::npos; -} - - -string stringUtils::quote - (const string& str, const string& escapeSpecialChars, const string& escapeChar) -{ - std::ostringstream oss; - size_t lastPos = 0, pos = 0; - - while ((pos = str.find_first_of(escapeSpecialChars, lastPos)) != string::npos) - { - oss << str.substr(lastPos, pos - lastPos) - << escapeChar - << str[pos]; - - lastPos = pos + 1; - } - - oss << str.substr(lastPos); - - return oss.str(); -} - - -} // utility -} // vmime diff --git a/src/utility/sync/criticalSection.cpp b/src/utility/sync/criticalSection.cpp deleted file mode 100644 index f2512d14..00000000 --- a/src/utility/sync/criticalSection.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/sync/criticalSection.hpp" - - -namespace vmime { -namespace utility { -namespace sync { - - -criticalSection::criticalSection() -{ -} - - -criticalSection::~criticalSection() -{ -} - - -} // sync -} // utility -} // vmime diff --git a/src/utility/url.cpp b/src/utility/url.cpp deleted file mode 100644 index ce0dc39a..00000000 --- a/src/utility/url.cpp +++ /dev/null @@ -1,406 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/url.hpp" - -#include "vmime/parserHelpers.hpp" -#include "vmime/utility/urlUtils.hpp" -#include "vmime/exception.hpp" - -#include <sstream> - - -namespace vmime { -namespace utility { - - -// Unspecified port -const port_t url::UNSPECIFIED_PORT = static_cast <port_t>(-1); - -// Known protocols -const string url::PROTOCOL_FILE = "file"; -const string url::PROTOCOL_HTTP = "http"; -const string url::PROTOCOL_FTP = "ftp"; - - - -url::url(const string& s) -{ - parse(s); -} - - -url::url(const url& u) -{ - operator=(u); -} - - -url::url(const string& protocol, const string& host, const port_t port, - const string& path, const string& username, const string& password) - : m_protocol(protocol), m_username(username), m_password(password), - m_host(host), m_port(port), m_path(path) -{ -} - - -url& url::operator=(const url& u) -{ - m_protocol = u.m_protocol; - - m_username = u.m_username; - m_password = u.m_password; - - m_host = u.m_host; - m_port = u.m_port; - - m_path = u.m_path; - - m_params = u.m_params; - - return (*this); -} - - -url& url::operator=(const string& s) -{ - parse(s); - - return (*this); -} - - -url::operator string() const -{ - return build(); -} - - -const string url::build() const -{ - std::ostringstream oss; - oss.imbue(std::locale::classic()); - - oss << m_protocol << "://"; - - if (!m_username.empty()) - { - oss << urlUtils::encode(m_username); - - if (!m_password.empty()) - { - oss << ":"; - oss << urlUtils::encode(m_password); - } - - oss << "@"; - } - - oss << urlUtils::encode(m_host); - - if (m_port != UNSPECIFIED_PORT) - { - oss << ":"; - oss << m_port; - } - - if (!m_path.empty()) - { - oss << "/"; - oss << urlUtils::encode(m_path); - } - - - if (!m_params.empty()) - { - if (m_path.empty()) - oss << "/"; - - oss << "?"; - - for (std::map <string, string>::const_iterator it = m_params.begin() ; - it != m_params.end() ; ++it) - { - if (it != m_params.begin()) - oss << "&"; - - oss << urlUtils::encode((*it).first); - oss << "="; - oss << urlUtils::encode((*it).second); - } - } - - return (oss.str()); -} - - -void url::parse(const string& str) -{ - // Protocol - const size_t protoEnd = str.find("://"); - if (protoEnd == string::npos) throw exceptions::malformed_url("No protocol separator"); - - const string proto = - utility::stringUtils::toLower(string(str.begin(), str.begin() + protoEnd)); - - // Username/password - size_t slashPos = str.find('/', protoEnd + 3); - if (slashPos == string::npos) slashPos = str.length(); - - size_t atPos = str.rfind('@', slashPos); - string hostPart; - - string username; - string password; - - if (proto == PROTOCOL_FILE) - { - // No user name, password and host part. - slashPos = protoEnd + 3; - } - else - { - if (atPos != string::npos && atPos < slashPos) - { - const string userPart(str.begin() + protoEnd + 3, str.begin() + atPos); - const size_t colonPos = userPart.find(':'); - - if (colonPos == string::npos) - { - username = userPart; - } - else - { - username = string(userPart.begin(), userPart.begin() + colonPos); - password = string(userPart.begin() + colonPos + 1, userPart.end()); - } - - hostPart = string(str.begin() + atPos + 1, str.begin() + slashPos); - } - else - { - hostPart = string(str.begin() + protoEnd + 3, str.begin() + slashPos); - } - } - - // Host/port - const size_t colonPos = hostPart.find(':'); - - string host; - string port; - - if (colonPos == string::npos) - { - host = utility::stringUtils::trim(hostPart); - } - else - { - host = utility::stringUtils::trim(string(hostPart.begin(), hostPart.begin() + colonPos)); - port = utility::stringUtils::trim(string(hostPart.begin() + colonPos + 1, hostPart.end())); - } - - // Path - string path = utility::stringUtils::trim(string(str.begin() + slashPos, str.end())); - string params; - - size_t paramSep = path.find_first_of('?'); - - if (paramSep != string::npos) - { - params = string(path.begin() + paramSep + 1, path.end()); - path.erase(path.begin() + paramSep, path.end()); - } - - if (path == "/") - path.clear(); - - // Some sanity check - if (proto.empty()) - throw exceptions::malformed_url("No protocol specified"); - else if (host.empty()) - { - // Accept empty host (eg. "file:///home/vincent/mydoc") - if (proto != PROTOCOL_FILE) - throw exceptions::malformed_url("No host specified"); - } - - bool onlyDigit = true; - - for (string::const_iterator it = port.begin() ; - onlyDigit && it != port.end() ; ++it) - { - onlyDigit = parserHelpers::isDigit(*it); - } - - if (!onlyDigit) - throw exceptions::malformed_url("Port can only contain digits"); - - std::istringstream iss(port); - port_t portNum = 0; - - iss >> portNum; - - if (portNum == 0) - portNum = UNSPECIFIED_PORT; - - // Extract parameters - m_params.clear(); - - if (!params.empty()) - { - size_t pos = 0; - - do - { - const size_t start = pos; - - pos = params.find_first_of('&', pos); - - const size_t equal = params.find_first_of('=', start); - const size_t end = - (pos == string::npos ? params.length() : pos); - - string name; - string value; - - if (equal == string::npos || equal > pos) // no value - { - name = string(params.begin() + start, params.begin() + end); - value = name; - } - else - { - name = string(params.begin() + start, params.begin() + equal); - value = string(params.begin() + equal + 1, params.begin() + end); - } - - name = urlUtils::decode(name); - value = urlUtils::decode(value); - - m_params[name] = value; - - if (pos != string::npos) - ++pos; - } - while (pos != string::npos); - } - - // Now, save URL parts - m_protocol = proto; - - m_username = urlUtils::decode(username); - m_password = urlUtils::decode(password); - - m_host = urlUtils::decode(host); - m_port = portNum; - - m_path = urlUtils::decode(path); -} - - -const string& url::getProtocol() const -{ - return (m_protocol); -} - - -void url::setProtocol(const string& protocol) -{ - m_protocol = protocol; -} - - -const string& url::getUsername() const -{ - return (m_username); -} - - -void url::setUsername(const string& username) -{ - m_username = username; -} - - -const string& url::getPassword() const -{ - return (m_password); -} - - -void url::setPassword(const string& password) -{ - m_password = password; -} - - -const string& url::getHost() const -{ - return (m_host); -} - - -void url::setHost(const string& host) -{ - m_host = host; -} - - -port_t url::getPort() const -{ - return (m_port); -} - - -void url::setPort(const port_t port) -{ - m_port = port; -} - - -const string& url::getPath() const -{ - return (m_path); -} - - -void url::setPath(const string& path) -{ - m_path = path; -} - - -const std::map <string, string>& url::getParams() const -{ - return (m_params); -} - - -std::map <string, string>& url::getParams() -{ - return (m_params); -} - - -} // utility -} // vmime diff --git a/src/utility/urlUtils.cpp b/src/utility/urlUtils.cpp deleted file mode 100644 index 20818764..00000000 --- a/src/utility/urlUtils.cpp +++ /dev/null @@ -1,133 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/utility/urlUtils.hpp" -#include "vmime/parserHelpers.hpp" - - -namespace vmime { -namespace utility { - - -const string urlUtils::encode(const string& s) -{ - static const string RESERVED_CHARS = - /* reserved */ "$&+,/:;=?@" - /* unsafe */ "<>#%{}[]|\\^\"~`"; - - string result; - result.reserve(s.length()); - - for (string::const_iterator it = s.begin() ; it != s.end() ; ++it) - { - const char c = *it; - - if (parserHelpers::isPrint(c) && !parserHelpers::isSpace(c) && - static_cast <unsigned char>(c) <= 127 && - RESERVED_CHARS.find(c) == string::npos) - { - result += c; - } - else - { - char hex[4]; - const unsigned char k = static_cast <unsigned char>(c); - - hex[0] = '%'; - hex[1] = "0123456789ABCDEF"[k / 16]; - hex[2] = "0123456789ABCDEF"[k % 16]; - hex[3] = 0; - - result += hex; - } - } - - return (result); -} - - -const string urlUtils::decode(const string& s) -{ - string result; - result.reserve(s.length()); - - for (string::const_iterator it = s.begin() ; it != s.end() ; ) - { - const char c = *it; - - switch (c) - { - case '%': - { - ++it; // skip '%' - - const char_t p = (it != s.end() ? *(it++) : 0); - const char_t q = (it != s.end() ? *(it++) : 0); - - unsigned int r = 0; - - switch (p) - { - case 0: r = '%'; break; - case 'a': case 'A': r = 10; break; - case 'b': case 'B': r = 11; break; - case 'c': case 'C': r = 12; break; - case 'd': case 'D': r = 13; break; - case 'e': case 'E': r = 14; break; - case 'f': case 'F': r = 15; break; - default: r = p - '0'; break; - } - - if (q != 0) - { - r *= 16; - - switch (q) - { - case 'a': case 'A': r += 10; break; - case 'b': case 'B': r += 11; break; - case 'c': case 'C': r += 12; break; - case 'd': case 'D': r += 13; break; - case 'e': case 'E': r += 14; break; - case 'f': case 'F': r += 15; break; - default: r += q - '0'; break; - } - } - - result += static_cast <char>(r); - break; - } - default: - - result += c; - ++it; - break; - } - } - - return (result); -} - - -} // utility -} // vmime |
