aboutsummaryrefslogtreecommitdiffstats
path: root/src/base.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/base.hpp')
-rw-r--r--src/base.hpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/src/base.hpp b/src/base.hpp
new file mode 100644
index 00000000..a00d9c7d
--- /dev/null
+++ b/src/base.hpp
@@ -0,0 +1,216 @@
+//
+// VMime library (http://vmime.sourceforge.net)
+// Copyright (C) 2002-2004 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 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_BASE_HPP_INCLUDED
+#define VMIME_BASE_HPP_INCLUDED
+
+
+#include <string>
+#include <vector>
+#include <map>
+#include <sstream>
+#include <locale>
+
+#include "config.hpp"
+#include "types.hpp"
+#include "constants.hpp"
+#include "utility/stream.hpp"
+
+
+namespace vmime
+{
+ class text;
+ class charset;
+
+
+ // "Null" strings
+ extern const string NULL_STRING;
+#if VMIME_WIDE_CHAR_SUPPORT
+ extern const wstring NULL_WSTRING;
+#endif
+
+ extern const text NULL_TEXT;
+
+
+ //
+ // Library name and version
+ //
+
+ const string libname();
+ const string libversion();
+
+
+ //
+ // Helpful functions used for array -> iterator conversion
+ //
+
+ template <typename T, size_t N>
+ inline T const* begin(T const (&array)[N])
+ {
+ return (array);
+ }
+
+ template <typename T, size_t N>
+ inline T const* end(T const (&array)[N])
+ {
+ return (array + N);
+ }
+
+ template <typename T, size_t N>
+ inline size_t count(T const (&array)[N])
+ {
+ return (N);
+ }
+
+
+ //
+ // Some helpful functions
+ //
+
+ bool isStringEqualNoCase(const string& s1, const char* s2, const string::size_type n);
+ bool isStringEqualNoCase(const string& s1, const string& s2);
+ bool isStringEqualNoCase(const string::const_iterator begin, const string::const_iterator end, const char* s, const string::size_type n);
+
+
+ const string toLower(const string& str);
+ const string trim(const string& str);
+
+ template <class TYPE>
+ const string toString(const TYPE& value)
+ {
+ std::ostringstream oss;
+ oss << value;
+
+ return (oss.str());
+ }
+
+ template <class TYPE>
+ const TYPE fromString(const string& value)
+ {
+ TYPE ret;
+
+ std::istringstream iss(value);
+ iss >> ret;
+
+ return (ret);
+ }
+
+
+ // Free the pointer elements in a STL container and empty the container
+
+ template <class CONTAINER>
+ void free_container(CONTAINER& c)
+ {
+ for (typename CONTAINER::iterator it = c.begin() ; it != c.end() ; ++it)
+ delete (*it);
+
+ c.clear();
+ }
+
+
+ // Field contents encoding (RFC-2047 and folding)
+ string::size_type countASCIIchars(const string::const_iterator begin, const string::const_iterator end);
+
+ void encodeAndFoldText(utility::outputStream& os, const text& in, const string::size_type maxLineLength, const string::size_type firstLineOffset, string::size_type* lastLineLength, const int flags);
+ void decodeAndUnfoldText(const string& in, text& out);
+ void decodeAndUnfoldText(const string::const_iterator& inStart, const string::const_iterator& inEnd, text& out);
+
+ void makeWordsFromText(const string& in, const charset& ch, text& out);
+
+
+ //
+ // Some constants
+ //
+
+ // Flags used by "encodeAndFoldText" function
+ namespace encodeAndFoldFlags
+ {
+ enum
+ {
+ // If both "forceNoEncoding" and "forceEncoding" are specified,
+ // "forceNoEncoding" is used by default.
+ forceNoEncoding = (1 << 0),
+ forceEncoding = (1 << 1),
+
+ noNewLineSequence = (1 << 2),
+
+ none = 0
+ };
+ }
+
+ /*
+
+ RFC#2822
+ 2.1.1. Line Length Limits
+
+ There are two limits that this standard places on the number of
+ characters in a line. Each line of characters MUST be no more than
+ 998 characters, and SHOULD be no more than 78 characters, excluding
+ the CRLF.
+
+ The 998 character limit is due to limitations in many implementations
+ which send, receive, or store Internet Message Format messages that
+ simply cannot handle more than 998 characters on a line. Receiving
+ implementations would do well to handle an arbitrarily large number
+ of characters in a line for robustness sake. However, there are so
+ many implementations which (in compliance with the transport
+ requirements of [RFC2821]) do not accept messages containing more
+ than 1000 character including the CR and LF per line, it is important
+ for implementations not to create such messages.
+
+ The more conservative 78 character recommendation is to accommodate
+ the many implementations of user interfaces that display these
+ messages which may truncate, or disastrously wrap, the display of
+ more than 78 characters per line, in spite of the fact that such
+ implementations are non-conformant to the intent of this specification
+ (and that of [RFC2821] if they actually cause information to be lost).
+ Again, even though this limitation is put on messages, it is encumbant
+ upon implementations which display messages to handle an arbitrarily
+ large number of characters in a line (certainly at least up to the 998
+ character limit) for the sake of robustness.
+ */
+
+ namespace lineLengthLimits
+ {
+ extern const string::size_type infinite;
+
+ enum
+ {
+ max = 998,
+ convenient = 78
+ };
+ }
+
+
+ // New line sequence to be used when folding header fields.
+ extern const string NEW_LINE_SEQUENCE;
+ extern const string::size_type NEW_LINE_SEQUENCE_LENGTH;
+
+
+ // CR-LF sequence
+ extern const string CRLF;
+
+
+ // Mime version
+ extern const string MIME_VERSION;
+
+} // vmime
+
+
+#endif // VMIME_BASE_HPP_INCLUDED