From 3639b96ea888337f4d26a2b514e37e298b5afcd3 Mon Sep 17 00:00:00 2001 From: Vincent Richard Date: Thu, 31 Mar 2005 18:36:35 +0000 Subject: [PATCH] Support for message importance. --- ChangeLog | 5 ++ SConstruct | 3 +- src/misc/importanceHelper.cpp | 143 ++++++++++++++++++++++++++++++++ vmime/misc/importanceHelper.hpp | 80 ++++++++++++++++++ vmime/vmime.hpp | 3 + 5 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 src/misc/importanceHelper.cpp create mode 100644 vmime/misc/importanceHelper.hpp diff --git a/ChangeLog b/ChangeLog index 8463027d..29d6da1a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,11 @@ VERSION 0.6.4cvs ================ +2005-03-31 Vincent Richard + + * misc/importanceHelper.{cpp|hpp}: added support for message importance: + "X-Priority:" and "Importance:" fields. + 2005-03-28 Vincent Richard * messaging/POP3Store.cpp: fixed POP3Store::sendPacket() to send "\r\n" diff --git a/SConstruct b/SConstruct index ad5c4b23..fdc23403 100644 --- a/SConstruct +++ b/SConstruct @@ -157,7 +157,8 @@ libvmime_sources = [ 'mdn/MDNHelper.cpp', 'mdn/MDNHelper.hpp', 'mdn/MDNInfos.cpp', 'mdn/MDNInfos.hpp', 'mdn/receivedMDNInfos.cpp', 'mdn/receivedMDNInfos.hpp', - 'mdn/sendableMDNInfos.cpp', 'mdn/sendableMDNInfos.hpp' + 'mdn/sendableMDNInfos.cpp', 'mdn/sendableMDNInfos.hpp', + 'misc/importanceHelper.cpp', 'misc/importanceHelper.hpp' ] libvmime_examples_sources = [ diff --git a/src/misc/importanceHelper.cpp b/src/misc/importanceHelper.cpp new file mode 100644 index 00000000..ac36538d --- /dev/null +++ b/src/misc/importanceHelper.cpp @@ -0,0 +1,143 @@ +// +// VMime library (http://www.vmime.org) +// Copyright (C) 2002-2005 Vincent Richard +// +// 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/misc/importanceHelper.hpp" +#include "vmime/exception.hpp" + + +namespace vmime { +namespace misc { + + +void importanceHelper::resetImportance(message* msg) +{ + header* hdr = msg->getHeader(); + + try + { + headerField* fld = hdr->findField("X-Priority"); + hdr->removeField(fld); + } + catch (exceptions::no_such_field) + { + // Ignore + } + + try + { + headerField* fld = hdr->findField("Importance"); + hdr->removeField(fld); + } + catch (exceptions::no_such_field) + { + // Ignore + } +} + + +const importanceHelper::Importance importanceHelper::getImportance(const message* msg) +{ + const header* hdr = msg->getHeader(); + + try + { + const defaultField* fld = dynamic_cast (hdr->findField("X-Priority")); + const string value = fld->getValue(); + + int n = IMPORTANCE_NORMAL; + + std::istringstream iss(value); + iss >> n; + + Importance i = IMPORTANCE_NORMAL; + + switch (n) + { + case 1: i = IMPORTANCE_HIGHEST; break; + case 2: i = IMPORTANCE_HIGH; break; + case 3: i = IMPORTANCE_NORMAL; break; + case 4: i = IMPORTANCE_LOW; break; + case 5: i = IMPORTANCE_LOWEST; break; + } + + return (i); + } + catch (exceptions::no_such_field) + { + const defaultField* fld = dynamic_cast (hdr->findField("Importance")); + const string value = utility::stringUtils::toLower(utility::stringUtils::trim(fld->getValue())); + + if (value == "low") + return (IMPORTANCE_LOWEST); + else if (value == "high") + return (IMPORTANCE_HIGHEST); + else + return (IMPORTANCE_NORMAL); + } + + // Should not go here... + return (IMPORTANCE_NORMAL); +} + + +void importanceHelper::setImportance(message* msg, const Importance i) +{ + header* hdr = msg->getHeader(); + + // "X-Priority:" Field + defaultField* fld = dynamic_cast (hdr->getField("X-Priority")); + + switch (i) + { + case IMPORTANCE_HIGHEST: fld->setValue("1 (Highest)"); break; + case IMPORTANCE_HIGH: fld->setValue("2 (High)"); break; + default: + case IMPORTANCE_NORMAL: fld->setValue("3 (Normal)"); break; + case IMPORTANCE_LOW: fld->setValue("4 (Low)"); break; + case IMPORTANCE_LOWEST: fld->setValue("5 (Lowest)"); break; + } + + // "Importance:" Field + fld = dynamic_cast (hdr->getField("Importance")); + + switch (i) + { + case IMPORTANCE_HIGHEST: + case IMPORTANCE_HIGH: + + fld->setValue("high"); + break; + + default: + case IMPORTANCE_NORMAL: + + fld->setValue("normal"); + break; + + case IMPORTANCE_LOWEST: + case IMPORTANCE_LOW: + + fld->setValue("low"); + break; + } +} + + +} // misc +} // vmime diff --git a/vmime/misc/importanceHelper.hpp b/vmime/misc/importanceHelper.hpp new file mode 100644 index 00000000..d450defb --- /dev/null +++ b/vmime/misc/importanceHelper.hpp @@ -0,0 +1,80 @@ +// +// VMime library (http://www.vmime.org) +// Copyright (C) 2002-2005 Vincent Richard +// +// 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_MISC_IMPORTANCEHELPER_HPP_INCLUDED +#define VMIME_MISC_IMPORTANCEHELPER_HPP_INCLUDED + + +#include "vmime/message.hpp" + + +namespace vmime { +namespace misc { + + +/** Deals with setting and retrieving message importance (also + * known as priority). + * + * Basically, it wraps the use of the 'X-Priority' (non standard) + * and 'Importance' (RFC-1327, RFC-1911) fields. + */ + +class importanceHelper +{ +public: + + /** Different levels of importance. */ + enum Importance + { + IMPORTANCE_HIGHEST, + IMPORTANCE_HIGH, + IMPORTANCE_NORMAL, + IMPORTANCE_LOW, + IMPORTANCE_LOWEST + }; + + + /** Reset the importance of the message to the default importance. + * + * @param msg message on which to reset importance + */ + static void resetImportance(message* msg); + + /** Return the importance of the specified message. + * + * @param msg message from which to retrieve importance + * @return importance of the message, or default importance is no + * information about importance is given in the message + */ + static const Importance getImportance(const message* msg); + + /** Set the importance of the specified message. + * + * @param msg message on which to set importance + * @param i new message importance + */ + static void setImportance(message* msg, const Importance i); +}; + + +} // misc +} // vmime + + +#endif // VMIME_MISC_IMPORTANCEHELPER_HPP_INCLUDED diff --git a/vmime/vmime.hpp b/vmime/vmime.hpp index 694a2ba7..c0e52d3b 100644 --- a/vmime/vmime.hpp +++ b/vmime/vmime.hpp @@ -76,6 +76,9 @@ // MDN #include "vmime/mdn/MDNHelper.hpp" +// Misc +#include "vmime/misc/importanceHelper.hpp" + // Property set #include "vmime/propertySet.hpp"