Added 'utility::datetimeUtils' + fixed 'stringUtils' not in namespace 'utility'.

This commit is contained in:
Vincent Richard 2005-01-02 17:17:12 +00:00
parent 3a2aa8e9b8
commit af06b4a56d
30 changed files with 410 additions and 94 deletions

View File

@ -6,6 +6,10 @@ VERSION 0.6.2-cvs
* Added unit tests for utility::path and bodyPart. * Added unit tests for utility::path and bodyPart.
* Added 'utility::datetimeUtils' to provide some time-related functions.
* Fixed 'stringUtils' not in namespace 'utility'.
2005-01-01 Vincent Richard <vincent@vincent-richard.net> 2005-01-01 Vincent Richard <vincent@vincent-richard.net>
* Converted all C-style casts to C++-style casts. * Converted all C-style casts to C++-style casts.

View File

@ -140,6 +140,7 @@ libvmime_sources = [
'word.cpp', 'word.hpp', 'word.cpp', 'word.hpp',
'vmime.hpp', 'vmime.hpp',
'utility/file.hpp', 'utility/file.hpp',
'utility/datetimeUtils.cpp', 'utility/datetimeUtils.hpp',
'utility/md5.cpp', 'utility/md5.hpp', 'utility/md5.cpp', 'utility/md5.hpp',
'utility/path.cpp', 'utility/path.hpp', 'utility/path.cpp', 'utility/path.hpp',
'utility/random.cpp', 'utility/random.hpp', 'utility/random.cpp', 'utility/random.hpp',

View File

@ -270,7 +270,7 @@ charset& charset::operator=(const string& name)
const bool charset::operator==(const charset& value) const const bool charset::operator==(const charset& value) const
{ {
return (stringUtils::isStringEqualNoCase(m_name, value.m_name)); return (utility::stringUtils::isStringEqualNoCase(m_name, value.m_name));
} }

View File

@ -32,7 +32,7 @@ contentDisposition::contentDisposition()
contentDisposition::contentDisposition(const string& name) contentDisposition::contentDisposition(const string& name)
: m_name(stringUtils::toLower(name)) : m_name(utility::stringUtils::toLower(name))
{ {
} }
@ -46,7 +46,8 @@ contentDisposition::contentDisposition(const contentDisposition& type)
void contentDisposition::parse(const string& buffer, const string::size_type position, void contentDisposition::parse(const string& buffer, const string::size_type position,
const string::size_type end, string::size_type* newPosition) const string::size_type end, string::size_type* newPosition)
{ {
m_name = stringUtils::toLower(string(buffer.begin() + position, buffer.begin() + end)); m_name = utility::stringUtils::toLower
(string(buffer.begin() + position, buffer.begin() + end));
setParsedBounds(position, end); setParsedBounds(position, end);
@ -67,14 +68,14 @@ void contentDisposition::generate(utility::outputStream& os, const string::size_
contentDisposition& contentDisposition::operator=(const string& name) contentDisposition& contentDisposition::operator=(const string& name)
{ {
m_name = stringUtils::toLower(name); m_name = utility::stringUtils::toLower(name);
return (*this); return (*this);
} }
const bool contentDisposition::operator==(const contentDisposition& value) const const bool contentDisposition::operator==(const contentDisposition& value) const
{ {
return (stringUtils::toLower(m_name) == value.m_name); return (utility::stringUtils::toLower(m_name) == value.m_name);
} }

View File

@ -62,7 +62,7 @@ encoder* encoderFactory::create(const string& name)
const encoderFactory::registeredEncoder* encoderFactory::getEncoderByName(const string& name) const const encoderFactory::registeredEncoder* encoderFactory::getEncoderByName(const string& name) const
{ {
const string lcName(stringUtils::toLower(name)); const string lcName(utility::stringUtils::toLower(name));
for (std::vector <registeredEncoder*>::const_iterator it = m_encoders.begin() ; for (std::vector <registeredEncoder*>::const_iterator it = m_encoders.begin() ;
it != m_encoders.end() ; ++it) it != m_encoders.end() ; ++it)

View File

@ -35,7 +35,7 @@ encoding::encoding()
encoding::encoding(const string& name) encoding::encoding(const string& name)
: m_name(stringUtils::toLower(name)) : m_name(utility::stringUtils::toLower(name))
{ {
} }
@ -49,7 +49,8 @@ encoding::encoding(const encoding& enc)
void encoding::parse(const string& buffer, const string::size_type position, void encoding::parse(const string& buffer, const string::size_type position,
const string::size_type end, string::size_type* newPosition) const string::size_type end, string::size_type* newPosition)
{ {
m_name = stringUtils::toLower(string(buffer.begin() + position, buffer.begin() + end)); m_name = utility::stringUtils::toLower
(string(buffer.begin() + position, buffer.begin() + end));
setParsedBounds(position, end); setParsedBounds(position, end);
@ -83,14 +84,14 @@ encoding& encoding::operator=(const encoding& other)
encoding& encoding::operator=(const string& name) encoding& encoding::operator=(const string& name)
{ {
m_name = stringUtils::toLower(name); m_name = utility::stringUtils::toLower(name);
return (*this); return (*this);
} }
const bool encoding::operator==(const encoding& value) const const bool encoding::operator==(const encoding& value) const
{ {
return (stringUtils::toLower(m_name) == value.m_name); return (utility::stringUtils::toLower(m_name) == value.m_name);
} }

View File

@ -72,7 +72,7 @@ void fileAttachment::generatePart(bodyPart& part) const
contentDispositionField& cdf = part.getHeader()->ContentDisposition(); contentDispositionField& cdf = part.getHeader()->ContentDisposition();
if (m_fileInfo.hasSize()) cdf.setSize(stringUtils::toString(m_fileInfo.getSize())); if (m_fileInfo.hasSize()) cdf.setSize(utility::stringUtils::toString(m_fileInfo.getSize()));
if (m_fileInfo.hasFilename()) cdf.setFilename(m_fileInfo.getFilename()); if (m_fileInfo.hasFilename()) cdf.setFilename(m_fileInfo.getFilename());
if (m_fileInfo.hasCreationDate()) cdf.setCreationDate(m_fileInfo.getCreationDate()); if (m_fileInfo.hasCreationDate()) cdf.setCreationDate(m_fileInfo.getCreationDate());
if (m_fileInfo.hasModificationDate()) cdf.setModificationDate(m_fileInfo.getModificationDate()); if (m_fileInfo.hasModificationDate()) cdf.setModificationDate(m_fileInfo.getModificationDate());

View File

@ -300,12 +300,12 @@ header& header::operator=(const header& other)
const bool header::hasField(const string& fieldName) const const bool header::hasField(const string& fieldName) const
{ {
const string name = stringUtils::toLower(fieldName); const string name = utility::stringUtils::toLower(fieldName);
std::vector <headerField*>::const_iterator pos = m_fields.begin(); std::vector <headerField*>::const_iterator pos = m_fields.begin();
const std::vector <headerField*>::const_iterator end = m_fields.end(); const std::vector <headerField*>::const_iterator end = m_fields.end();
for ( ; pos != end && stringUtils::toLower((*pos)->getName()) != name ; ++pos); for ( ; pos != end && utility::stringUtils::toLower((*pos)->getName()) != name ; ++pos);
return (pos != end); return (pos != end);
} }
@ -313,13 +313,13 @@ const bool header::hasField(const string& fieldName) const
headerField* header::findField(const string& fieldName) const headerField* header::findField(const string& fieldName) const
{ {
const string name = stringUtils::toLower(fieldName); const string name = utility::stringUtils::toLower(fieldName);
// Find the first field that matches the specified name // Find the first field that matches the specified name
std::vector <headerField*>::const_iterator pos = m_fields.begin(); std::vector <headerField*>::const_iterator pos = m_fields.begin();
const std::vector <headerField*>::const_iterator end = m_fields.end(); const std::vector <headerField*>::const_iterator end = m_fields.end();
for ( ; pos != end && stringUtils::toLower((*pos)->getName()) != name ; ++pos); for ( ; pos != end && utility::stringUtils::toLower((*pos)->getName()) != name ; ++pos);
// No field with this name can be found // No field with this name can be found
if (pos == end) if (pos == end)
@ -336,7 +336,7 @@ headerField* header::findField(const string& fieldName) const
std::vector <headerField*> header::findAllFields(const string& fieldName) std::vector <headerField*> header::findAllFields(const string& fieldName)
{ {
const string name = stringUtils::toLower(fieldName); const string name = utility::stringUtils::toLower(fieldName);
std::vector <headerField*> result; std::vector <headerField*> result;
@ -346,7 +346,7 @@ std::vector <headerField*> header::findAllFields(const string& fieldName)
for ( ; pos != end ; ++pos) for ( ; pos != end ; ++pos)
{ {
// Add the header if it matches the specified type // Add the header if it matches the specified type
if (stringUtils::toLower((*pos)->getName()) == name) if (utility::stringUtils::toLower((*pos)->getName()) == name)
{ {
result.push_back(*pos); result.push_back(*pos);
} }
@ -358,13 +358,13 @@ std::vector <headerField*> header::findAllFields(const string& fieldName)
headerField* header::getField(const string& fieldName) headerField* header::getField(const string& fieldName)
{ {
const string name = stringUtils::toLower(fieldName); const string name = utility::stringUtils::toLower(fieldName);
// Find the first field that matches the specified name // Find the first field that matches the specified name
std::vector <headerField*>::const_iterator pos = m_fields.begin(); std::vector <headerField*>::const_iterator pos = m_fields.begin();
const std::vector <headerField*>::const_iterator end = m_fields.end(); const std::vector <headerField*>::const_iterator end = m_fields.end();
for ( ; pos != end && stringUtils::toLower((*pos)->getName()) != name ; ++pos); for ( ; pos != end && utility::stringUtils::toLower((*pos)->getName()) != name ; ++pos);
// If no field with this name can be found, create a new one // If no field with this name can be found, create a new one
if (pos == end) if (pos == end)

View File

@ -66,7 +66,7 @@ headerFieldFactory::~headerFieldFactory()
headerField* headerFieldFactory::create headerField* headerFieldFactory::create
(const string& name, const string& body) (const string& name, const string& body)
{ {
NameMap::const_iterator pos = m_nameMap.find(stringUtils::toLower(name)); NameMap::const_iterator pos = m_nameMap.find(utility::stringUtils::toLower(name));
headerField* field = NULL; headerField* field = NULL;
if (pos != m_nameMap.end()) if (pos != m_nameMap.end())

View File

@ -38,7 +38,8 @@ mediaType::mediaType(const string& type)
mediaType::mediaType(const string& type, const string& subType) mediaType::mediaType(const string& type, const string& subType)
: m_type(stringUtils::toLower(type)), m_subType(stringUtils::toLower(subType)) : m_type(utility::stringUtils::toLower(type)),
m_subType(utility::stringUtils::toLower(subType))
{ {
} }
@ -55,7 +56,8 @@ void mediaType::parse(const string& buffer, const string::size_type position,
while (p < pend && *p != '/') ++p; while (p < pend && *p != '/') ++p;
m_type = stringUtils::toLower(string(buffer.begin() + typeStart, m_type = utility::stringUtils::toLower(
string(buffer.begin() + typeStart,
buffer.begin() + position + (p - pstart))); buffer.begin() + position + (p - pstart)));
if (p < pend) if (p < pend)
@ -64,7 +66,8 @@ void mediaType::parse(const string& buffer, const string::size_type position,
++p; ++p;
// Extract the sub-type // Extract the sub-type
m_subType = stringUtils::toLower(string(buffer.begin() + position + (p - pstart), m_subType = utility::stringUtils::toLower(
string(buffer.begin() + position + (p - pstart),
buffer.begin() + end)); buffer.begin() + end));
} }
@ -147,7 +150,7 @@ const string& mediaType::getType() const
void mediaType::setType(const string& type) void mediaType::setType(const string& type)
{ {
m_type = stringUtils::toLower(type); m_type = utility::stringUtils::toLower(type);
} }
@ -159,7 +162,7 @@ const string& mediaType::getSubType() const
void mediaType::setSubType(const string& subType) void mediaType::setSubType(const string& subType)
{ {
m_subType = stringUtils::toLower(subType); m_subType = utility::stringUtils::toLower(subType);
} }

View File

@ -85,7 +85,7 @@ const bool maildirStore::isValidFolderName(const folder::path::component& name)
const string& buf = name.getBuffer(); const string& buf = name.getBuffer();
// Name cannot start/end with spaces // Name cannot start/end with spaces
if (stringUtils::trim(buf) != name.getBuffer()) if (utility::stringUtils::trim(buf) != name.getBuffer())
return false; return false;
// Name cannot start with '.' // Name cannot start with '.'

View File

@ -79,7 +79,7 @@ service* serviceFactory::create
const serviceFactory::registeredService* serviceFactory::getServiceByProtocol(const string& protocol) const const serviceFactory::registeredService* serviceFactory::getServiceByProtocol(const string& protocol) const
{ {
const string name(stringUtils::toLower(protocol)); const string name(utility::stringUtils::toLower(protocol));
for (std::vector <registeredService*>::const_iterator it = m_services.begin() ; for (std::vector <registeredService*>::const_iterator it = m_services.begin() ;
it != m_services.end() ; ++it) it != m_services.end() ; ++it)

View File

@ -131,7 +131,7 @@ void url::parse(const string& str)
if (protoEnd == string::npos) throw exceptions::malformed_url("No protocol separator"); if (protoEnd == string::npos) throw exceptions::malformed_url("No protocol separator");
const string proto = const string proto =
stringUtils::toLower(string(str.begin(), str.begin() + protoEnd)); utility::stringUtils::toLower(string(str.begin(), str.begin() + protoEnd));
// Username/password // Username/password
string::size_type slashPos = str.find('/', protoEnd + 3); string::size_type slashPos = str.find('/', protoEnd + 3);
@ -190,7 +190,7 @@ void url::parse(const string& str)
} }
// Path // Path
string path = stringUtils::trim(string(str.begin() + slashPos, str.end())); string path = utility::stringUtils::trim(string(str.begin() + slashPos, str.end()));
if (path == "/") if (path == "/")
path.clear(); path.clear();

View File

@ -45,7 +45,7 @@ parameterFactory::~parameterFactory()
parameter* parameterFactory::create parameter* parameterFactory::create
(const string& name, const string& value) (const string& name, const string& value)
{ {
const string lcName = stringUtils::toLower(name); const string lcName = utility::stringUtils::toLower(name);
NameMap::const_iterator pos = m_nameMap.find(lcName); NameMap::const_iterator pos = m_nameMap.find(lcName);
parameter* param = NULL; parameter* param = NULL;

View File

@ -248,12 +248,12 @@ parameterizedHeaderField& parameterizedHeaderField::operator=(const parameterize
const bool parameterizedHeaderField::hasParameter(const string& paramName) const const bool parameterizedHeaderField::hasParameter(const string& paramName) const
{ {
const string name = stringUtils::toLower(paramName); const string name = utility::stringUtils::toLower(paramName);
std::vector <parameter*>::const_iterator pos = m_params.begin(); std::vector <parameter*>::const_iterator pos = m_params.begin();
const std::vector <parameter*>::const_iterator end = m_params.end(); const std::vector <parameter*>::const_iterator end = m_params.end();
for ( ; pos != end && stringUtils::toLower((*pos)->getName()) != name ; ++pos); for ( ; pos != end && utility::stringUtils::toLower((*pos)->getName()) != name ; ++pos);
return (pos != end); return (pos != end);
} }
@ -261,13 +261,13 @@ const bool parameterizedHeaderField::hasParameter(const string& paramName) const
parameter* parameterizedHeaderField::findParameter(const string& paramName) const parameter* parameterizedHeaderField::findParameter(const string& paramName) const
{ {
const string name = stringUtils::toLower(paramName); const string name = utility::stringUtils::toLower(paramName);
// Find the first parameter that matches the specified name // Find the first parameter that matches the specified name
std::vector <parameter*>::const_iterator pos = m_params.begin(); std::vector <parameter*>::const_iterator pos = m_params.begin();
const std::vector <parameter*>::const_iterator end = m_params.end(); const std::vector <parameter*>::const_iterator end = m_params.end();
for ( ; pos != end && stringUtils::toLower((*pos)->getName()) != name ; ++pos); for ( ; pos != end && utility::stringUtils::toLower((*pos)->getName()) != name ; ++pos);
// No parameter with this name can be found // No parameter with this name can be found
if (pos == end) if (pos == end)
@ -284,13 +284,13 @@ parameter* parameterizedHeaderField::findParameter(const string& paramName) cons
parameter* parameterizedHeaderField::getParameter(const string& paramName) parameter* parameterizedHeaderField::getParameter(const string& paramName)
{ {
const string name = stringUtils::toLower(paramName); const string name = utility::stringUtils::toLower(paramName);
// Find the first parameter that matches the specified name // Find the first parameter that matches the specified name
std::vector <parameter*>::const_iterator pos = m_params.begin(); std::vector <parameter*>::const_iterator pos = m_params.begin();
const std::vector <parameter*>::const_iterator end = m_params.end(); const std::vector <parameter*>::const_iterator end = m_params.end();
for ( ; pos != end && stringUtils::toLower((*pos)->getName()) != name ; ++pos); for ( ; pos != end && utility::stringUtils::toLower((*pos)->getName()) != name ; ++pos);
// If no parameter with this name can be found, create a new one // If no parameter with this name can be found, create a new one
if (pos == end) if (pos == end)

View File

@ -308,7 +308,7 @@ const string propertySet::property::getValue() const
template <> template <>
const bool propertySet::property::getValue() const const bool propertySet::property::getValue() const
{ {
if (stringUtils::toLower(m_value) == "true") if (utility::stringUtils::toLower(m_value) == "true")
return true; return true;
else else
{ {

View File

@ -115,32 +115,32 @@ void relay::parse(const string& buffer, const string::size_type position,
if (!inComment) if (!inComment)
{ {
if (stringUtils::isStringEqualNoCase(word, "from", 4)) if (utility::stringUtils::isStringEqualNoCase(word, "from", 4))
{ {
newPart = Part_From; newPart = Part_From;
keyword = true; keyword = true;
} }
else if (stringUtils::isStringEqualNoCase(word, "by", 2)) else if (utility::stringUtils::isStringEqualNoCase(word, "by", 2))
{ {
newPart = Part_By; newPart = Part_By;
keyword = true; keyword = true;
} }
else if (stringUtils::isStringEqualNoCase(word, "via", 2)) else if (utility::stringUtils::isStringEqualNoCase(word, "via", 2))
{ {
newPart = Part_Via; newPart = Part_Via;
keyword = true; keyword = true;
} }
else if (stringUtils::isStringEqualNoCase(word, "with", 2)) else if (utility::stringUtils::isStringEqualNoCase(word, "with", 2))
{ {
newPart = Part_With; newPart = Part_With;
keyword = true; keyword = true;
} }
else if (stringUtils::isStringEqualNoCase(word, "id", 2)) else if (utility::stringUtils::isStringEqualNoCase(word, "id", 2))
{ {
newPart = Part_Id; newPart = Part_Id;
keyword = true; keyword = true;
} }
else if (stringUtils::isStringEqualNoCase(word, "for", 2)) else if (utility::stringUtils::isStringEqualNoCase(word, "for", 2))
{ {
newPart = Part_For; newPart = Part_For;
keyword = true; keyword = true;

View File

@ -336,7 +336,7 @@ void text::encodeAndFold(utility::outputStream& os, const string::size_type maxL
// Calculate the number of ASCII chars to check whether encoding is needed // Calculate the number of ASCII chars to check whether encoding is needed
// and _which_ encoding to use. // and _which_ encoding to use.
const string::size_type asciiCount = const string::size_type asciiCount =
stringUtils::countASCIIchars(buffer.begin(), buffer.end()); utility::stringUtils::countASCIIchars(buffer.begin(), buffer.end());
bool noEncoding = (flags & FORCE_NO_ENCODING) || bool noEncoding = (flags & FORCE_NO_ENCODING) ||
(!(flags & FORCE_ENCODING) && asciiCount == buffer.length()); (!(flags & FORCE_ENCODING) && asciiCount == buffer.length());

View File

@ -0,0 +1,221 @@
//
// VMime library (http://vmime.sourceforge.net)
// Copyright (C) 2002-2004 Vincent Richard <vincent@vincent-richard.net>
//
// 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include "vmime/utility/datetimeUtils.hpp"
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::localTimeToUniversalTime(const datetime& date)
{
if (date.getZone() == datetime::GMT)
return (date);
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::universalTimeToLocalTime(const datetime& date, const int zone)
{
if (zone == 0)
return (date);
datetime nd(date);
nd.setZone(zone);
const int z = zone;
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: 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);
}
const bool datetimeUtils::isLeapYear(const int year)
{
// From RFC 3339 - Appendix C. Leap Years:
return ((year % 4) == 0 && (year % 100 != 0 || year % 400 == 0));
}
const 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 };
return (isLeapYear(year) ? daysInMonthLeapYear[month - 1] : daysInMonth[month - 1]);
}
} // utility
} // vmime

View File

@ -20,8 +20,8 @@
#include "vmime/utility/stringUtils.hpp" #include "vmime/utility/stringUtils.hpp"
namespace vmime namespace vmime {
{ namespace utility {
const bool stringUtils::isStringEqualNoCase const bool stringUtils::isStringEqualNoCase
@ -119,4 +119,5 @@ const string::size_type stringUtils::countASCIIchars
} }
} // utility
} // vmime } // vmime

View File

@ -33,75 +33,78 @@ namespace
{ {
class stringUtilsTest : public suite class stringUtilsTest : public suite
{ {
typedef vmime::utility::stringUtils stringUtils;
void testIsStringEqualNoCase1() void testIsStringEqualNoCase1()
{ {
assert_eq("1", true, vmime::stringUtils::isStringEqualNoCase(vmime::string("foo"), "foo", 3)); assert_eq("1", true, stringUtils::isStringEqualNoCase(vmime::string("foo"), "foo", 3));
assert_eq("2", true, vmime::stringUtils::isStringEqualNoCase(vmime::string("FOo"), "foo", 3)); assert_eq("2", true, stringUtils::isStringEqualNoCase(vmime::string("FOo"), "foo", 3));
assert_eq("3", false, vmime::stringUtils::isStringEqualNoCase(vmime::string("foo"), "FOo", 3)); assert_eq("3", false, stringUtils::isStringEqualNoCase(vmime::string("foo"), "FOo", 3));
assert_eq("4", false, vmime::stringUtils::isStringEqualNoCase(vmime::string("foo"), "bar", 3)); assert_eq("4", false, stringUtils::isStringEqualNoCase(vmime::string("foo"), "bar", 3));
} }
void testIsStringEqualNoCase2() void testIsStringEqualNoCase2()
{ {
assert_eq("1", true, vmime::stringUtils::isStringEqualNoCase(vmime::string("foo"), vmime::string("foo"))); assert_eq("1", true, stringUtils::isStringEqualNoCase(vmime::string("foo"), vmime::string("foo")));
assert_eq("2", true, vmime::stringUtils::isStringEqualNoCase(vmime::string("FOo"), vmime::string("foo"))); assert_eq("2", true, stringUtils::isStringEqualNoCase(vmime::string("FOo"), vmime::string("foo")));
assert_eq("3", true, vmime::stringUtils::isStringEqualNoCase(vmime::string("foO"), vmime::string("FOo"))); assert_eq("3", true, stringUtils::isStringEqualNoCase(vmime::string("foO"), vmime::string("FOo")));
} }
void testIsStringEqualNoCase3() void testIsStringEqualNoCase3()
{ {
vmime::string str1("FooBar"); vmime::string str1("FooBar");
assert_eq("1", true, vmime::stringUtils::isStringEqualNoCase(str1.begin(), str1.end(), "foobar", 6)); assert_eq("1", true, stringUtils::isStringEqualNoCase(str1.begin(), str1.end(), "foobar", 6));
assert_eq("2", false, vmime::stringUtils::isStringEqualNoCase(str1.begin(), str1.end(), "FooBar", 6)); assert_eq("2", false, stringUtils::isStringEqualNoCase(str1.begin(), str1.end(), "FooBar", 6));
assert_eq("3", true, vmime::stringUtils::isStringEqualNoCase(str1.begin(), str1.end(), "fooBar", 3)); assert_eq("3", true, stringUtils::isStringEqualNoCase(str1.begin(), str1.end(), "fooBar", 3));
assert_eq("4", false, vmime::stringUtils::isStringEqualNoCase(str1.begin(), str1.begin() + 3, "fooBar", 6)); assert_eq("4", false, stringUtils::isStringEqualNoCase(str1.begin(), str1.begin() + 3, "fooBar", 6));
} }
void testToLower() void testToLower()
{ {
assert_eq("1", "foo", vmime::stringUtils::toLower("FOO")); assert_eq("1", "foo", stringUtils::toLower("FOO"));
assert_eq("2", "foo", vmime::stringUtils::toLower("foO")); assert_eq("2", "foo", stringUtils::toLower("foO"));
assert_eq("3", "foo", vmime::stringUtils::toLower("foo")); assert_eq("3", "foo", stringUtils::toLower("foo"));
} }
void testTrim() void testTrim()
{ {
assert_eq("1", "foo", vmime::stringUtils::trim(" foo")); assert_eq("1", "foo", stringUtils::trim(" foo"));
assert_eq("2", "foo", vmime::stringUtils::trim("\t\tfoo")); assert_eq("2", "foo", stringUtils::trim("\t\tfoo"));
assert_eq("3", "foo", vmime::stringUtils::trim(" \t \tfoo")); assert_eq("3", "foo", stringUtils::trim(" \t \tfoo"));
assert_eq("4", "foo", vmime::stringUtils::trim(" \r\n\tfoo")); assert_eq("4", "foo", stringUtils::trim(" \r\n\tfoo"));
assert_eq("5", "foo", vmime::stringUtils::trim("foo ")); assert_eq("5", "foo", stringUtils::trim("foo "));
assert_eq("6", "foo", vmime::stringUtils::trim("foo\t\t")); assert_eq("6", "foo", stringUtils::trim("foo\t\t"));
assert_eq("7", "foo", vmime::stringUtils::trim("foo \t \t")); assert_eq("7", "foo", stringUtils::trim("foo \t \t"));
assert_eq("8", "foo", vmime::stringUtils::trim("foo \r\n\t")); assert_eq("8", "foo", stringUtils::trim("foo \r\n\t"));
assert_eq( "9", "foo", vmime::stringUtils::trim("foo ")); assert_eq( "9", "foo", stringUtils::trim("foo "));
assert_eq("10", "foo", vmime::stringUtils::trim(" foo ")); assert_eq("10", "foo", stringUtils::trim(" foo "));
assert_eq("11", "foo", vmime::stringUtils::trim(" foo\t\t")); assert_eq("11", "foo", stringUtils::trim(" foo\t\t"));
assert_eq("12", "foo", vmime::stringUtils::trim("\tfoo \r \t")); assert_eq("12", "foo", stringUtils::trim("\tfoo \r \t"));
assert_eq("13", "foo", vmime::stringUtils::trim("\r \tfoo \n\t")); assert_eq("13", "foo", stringUtils::trim("\r \tfoo \n\t"));
} }
void testCountASCIIChars() void testCountASCIIChars()
{ {
vmime::string str1("foo"); vmime::string str1("foo");
assert_eq("1", static_cast <vmime::string::size_type>(3), assert_eq("1", static_cast <vmime::string::size_type>(3),
vmime::stringUtils::countASCIIchars(str1.begin(), str1.end())); stringUtils::countASCIIchars(str1.begin(), str1.end()));
vmime::string str2("f=?oo"); vmime::string str2("f=?oo");
assert_eq("2", static_cast <vmime::string::size_type>(3 + 1), assert_eq("2", static_cast <vmime::string::size_type>(3 + 1),
vmime::stringUtils::countASCIIchars(str2.begin(), str2.end())); stringUtils::countASCIIchars(str2.begin(), str2.end()));
vmime::string str3("foo\x7f"); vmime::string str3("foo\x7f");
assert_eq("3", static_cast <vmime::string::size_type>(4), assert_eq("3", static_cast <vmime::string::size_type>(4),
vmime::stringUtils::countASCIIchars(str3.begin(), str3.end())); stringUtils::countASCIIchars(str3.begin(), str3.end()));
vmime::string str4("foo\x80"); vmime::string str4("foo\x80");
assert_eq("4", static_cast <vmime::string::size_type>(3), assert_eq("4", static_cast <vmime::string::size_type>(3),
vmime::stringUtils::countASCIIchars(str4.begin(), str4.end())); stringUtils::countASCIIchars(str4.begin(), str4.end()));
} }
public: public:

View File

@ -100,7 +100,7 @@ public:
template <class E> template <class E>
void registerName(const string& name) void registerName(const string& name)
{ {
m_encoders.push_back(new registeredEncoderImpl <E>(stringUtils::toLower(name))); m_encoders.push_back(new registeredEncoderImpl <E>(utility::stringUtils::toLower(name)));
} }
/** Create a new encoder instance from an encoding name. /** Create a new encoder instance from an encoding name.

View File

@ -64,7 +64,8 @@ public:
template <class T> template <class T>
void registerName(const string& name) void registerName(const string& name)
{ {
m_nameMap.insert(NameMap::value_type(stringUtils::toLower(name), &registerer<T>::creator)); m_nameMap.insert(NameMap::value_type
(utility::stringUtils::toLower(name), &registerer<T>::creator));
} }
headerField* create(const string& name, const string& body = NULL_STRING); headerField* create(const string& name, const string& body = NULL_STRING);

View File

@ -1231,7 +1231,7 @@ public:
else else
{ {
atom* at = parser.get <atom>(line, &pos); atom* at = parser.get <atom>(line, &pos);
const string name = stringUtils::toLower(at->value()); const string name = utility::stringUtils::toLower(at->value());
delete (at); delete (at);
if (name == "answered") if (name == "answered")
@ -1403,7 +1403,7 @@ public:
parser.check <one_char <'\\'> >(line, &pos); parser.check <one_char <'\\'> >(line, &pos);
atom* at = parser.get <atom>(line, &pos); atom* at = parser.get <atom>(line, &pos);
const string name = stringUtils::toLower(at->value()); const string name = utility::stringUtils::toLower(at->value());
delete (at); delete (at);
if (name == "marked") if (name == "marked")
@ -1802,7 +1802,7 @@ public:
DEBUG_ENTER_COMPONENT("auth_type"); DEBUG_ENTER_COMPONENT("auth_type");
atom* at = parser.get <atom>(line, currentPos); atom* at = parser.get <atom>(line, currentPos);
m_name = stringUtils::toLower(at->value()); m_name = utility::stringUtils::toLower(at->value());
delete (at); delete (at);
if (m_name == "kerberos_v4") if (m_name == "kerberos_v4")
@ -2124,7 +2124,7 @@ public:
m_datetime.setDay(std::min(std::max(nd->value(), 1u), 31u)); m_datetime.setDay(std::min(std::max(nd->value(), 1u), 31u));
m_datetime.setYear(ny->value()); m_datetime.setYear(ny->value());
const string month(stringUtils::toLower(amo->value())); const string month(utility::stringUtils::toLower(amo->value()));
int mon = vmime::datetime::JANUARY; int mon = vmime::datetime::JANUARY;
if (month.length() >= 3) if (month.length() >= 3)

View File

@ -122,7 +122,7 @@ public:
template <class S> template <class S>
void registerServiceByProtocol(const string& protocol) void registerServiceByProtocol(const string& protocol)
{ {
const string name = stringUtils::toLower(protocol); const string name = utility::stringUtils::toLower(protocol);
m_services.push_back(new registeredServiceImpl <S>(name)); m_services.push_back(new registeredServiceImpl <S>(name));
} }

View File

@ -64,7 +64,8 @@ public:
template <class T> template <class T>
void registerName(const string& name) void registerName(const string& name)
{ {
m_nameMap.insert(NameMap::value_type(stringUtils::toLower(name), &registerer<T>::creator)); m_nameMap.insert(NameMap::value_type
(utility::stringUtils::toLower(name), &registerer<T>::creator));
} }
parameter* create(const string& name, const string& value = NULL_STRING); parameter* create(const string& name, const string& value = NULL_STRING);

View File

@ -262,11 +262,11 @@ private:
{ {
public: public:
propFinder(const string& name) : m_name(stringUtils::toLower(name)) { } propFinder(const string& name) : m_name(utility::stringUtils::toLower(name)) { }
const bool operator()(property* const p) const const bool operator()(property* const p) const
{ {
return (stringUtils::toLower(p->getName()) == m_name); return (utility::stringUtils::toLower(p->getName()) == m_name);
} }
private: private:

View File

@ -0,0 +1,75 @@
//
// VMime library (http://vmime.sourceforge.net)
// Copyright (C) 2002-2004 Vincent Richard <vincent@vincent-richard.net>
//
// 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#ifndef VMIME_DATETIMEUTILS_HPP_INCLUDED
#define VMIME_DATETIMEUTILS_HPP_INCLUDED
#include "vmime/dateTime.hpp"
namespace vmime {
namespace utility {
/** Miscellaneous functions related to date/time.
*/
class datetimeUtils
{
public:
/** Test whether the specified year is a leap year.
*
* @param year year in 4-digit format
* @return true if year is a leap year, false otherwise
*/
static const bool isLeapYear(const int year);
/** Return the number of days in the specified month.
*
* @param year year in 4-digit format (this is needed to check
* for leap years)
* @param month month, January is 1, December is 12 (see datetime::Months enum)
* @return the number of days in the month
*/
static const int getDaysInMonth(const int year, const int month);
/** Convert the specified local time and date to UT (GMT).
*
* @param date local date/time
* @return GMT date/time
*/
static const datetime localTimeToUniversalTime(const datetime& date);
/** Convert the specified UT to local time and date.
*
* @param date GMT date/time
* @param zone local zone to convert to (see datetime::TimeZones enum)
* @return local time and date
*/
static const datetime universalTimeToLocalTime(const datetime& date, const int zone);
};
} // utility
} // vmime
#endif // VMIME_DATETIMEUTILS_HPP_INCLUDED

View File

@ -17,8 +17,8 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// //
#ifndef VMIME_STRINGUTILS_HPP_INCLUDED #ifndef VMIME_UTILITY_STRINGUTILS_HPP_INCLUDED
#define VMIME_STRINGUTILS_HPP_INCLUDED #define VMIME_UTILITY_STRINGUTILS_HPP_INCLUDED
#include "vmime/types.hpp" #include "vmime/types.hpp"
@ -27,8 +27,8 @@
#include <sstream> #include <sstream>
namespace vmime namespace vmime {
{ namespace utility {
/** Miscellaneous functions related to strings. /** Miscellaneous functions related to strings.
@ -125,7 +125,8 @@ public:
}; };
} // utility
} // vmime } // vmime
#endif // VMIME_STRINGUTILS_HPP_INCLUDED #endif // VMIME_UTILITY_STRINGUTILS_HPP_INCLUDED

View File

@ -71,6 +71,9 @@
// Property set // Property set
#include "vmime/propertySet.hpp" #include "vmime/propertySet.hpp"
// Utilities
#include "vmime/utility/datetimeUtils.hpp"
// Messaging features // Messaging features
#if VMIME_HAVE_MESSAGING_FEATURES #if VMIME_HAVE_MESSAGING_FEATURES
#include "vmime/messaging/socket.hpp" #include "vmime/messaging/socket.hpp"