From 34595491817bd3d062b05fe0d2bfd4289410ab51 Mon Sep 17 00:00:00 2001 From: Vincent Richard Date: Thu, 14 Apr 2005 11:27:49 +0000 Subject: Moved 'url' and 'urlUtils' classes to 'utility' namespace. --- ChangeLog | 5 + SConstruct | 6 +- src/messaging/serviceFactory.cpp | 4 +- src/messaging/session.cpp | 4 +- src/messaging/url.cpp | 306 ------------------------------------- src/messaging/urlUtils.cpp | 94 ------------ src/utility/url.cpp | 306 +++++++++++++++++++++++++++++++++++++ src/utility/urlUtils.cpp | 94 ++++++++++++ vmime/messaging/serviceFactory.hpp | 5 +- vmime/messaging/session.hpp | 6 +- vmime/messaging/url.hpp | 188 ----------------------- vmime/messaging/urlUtils.hpp | 54 ------- vmime/utility/url.hpp | 189 +++++++++++++++++++++++ vmime/utility/urlUtils.hpp | 54 +++++++ 14 files changed, 661 insertions(+), 654 deletions(-) delete mode 100644 src/messaging/url.cpp delete mode 100644 src/messaging/urlUtils.cpp create mode 100644 src/utility/url.cpp create mode 100644 src/utility/urlUtils.cpp delete mode 100644 vmime/messaging/url.hpp delete mode 100644 vmime/messaging/urlUtils.hpp create mode 100644 vmime/utility/url.hpp create mode 100644 vmime/utility/urlUtils.hpp diff --git a/ChangeLog b/ChangeLog index b0a9c252..2a5c8c9b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,11 @@ VERSION 0.7.1cvs ================ +2005-04-14 Vincent Richard + + * url.{hpp|cpp}, urlUtils.{hpp|cpp}: moved 'url' and 'urlUtils' from + 'vmime::messaging' namespace to 'vmime::utility' namespace. + 2005-04-12 Vincent Richard * Started version 0.7.1. diff --git a/SConstruct b/SConstruct index 5019f2fb..3f98823b 100644 --- a/SConstruct +++ b/SConstruct @@ -155,6 +155,8 @@ libvmime_sources = [ 'utility/stream.cpp', 'utility/stream.hpp', 'utility/stringProxy.cpp', 'utility/stringProxy.hpp', 'utility/stringUtils.cpp', 'utility/stringUtils.hpp', + 'utility/url.cpp', 'utility/url.hpp', + 'utility/urlUtils.cpp', 'utility/urlUtils.hpp', 'mdn/MDNHelper.cpp', 'mdn/MDNHelper.hpp', 'mdn/MDNInfos.cpp', 'mdn/MDNInfos.hpp', 'mdn/receivedMDNInfos.cpp', 'mdn/receivedMDNInfos.hpp', @@ -192,9 +194,7 @@ libvmime_messaging_sources = [ 'messaging/socket.hpp', 'messaging/store.hpp', 'messaging/timeoutHandler.hpp', - 'messaging/transport.hpp', - 'messaging/url.cpp', 'messaging/url.hpp', - 'messaging/urlUtils.cpp', 'messaging/urlUtils.hpp' + 'messaging/transport.hpp' ] libvmime_messaging_proto_sources = [ diff --git a/src/messaging/serviceFactory.cpp b/src/messaging/serviceFactory.cpp index ea7166ba..ea1752dd 100644 --- a/src/messaging/serviceFactory.cpp +++ b/src/messaging/serviceFactory.cpp @@ -60,13 +60,13 @@ service* serviceFactory::create service* serviceFactory::create - (session* sess, const url& u, authenticator* auth) + (session* sess, const utility::url& u, authenticator* auth) { service* serv = create(sess, u.getProtocol(), auth); sess->getProperties()[serv->getInfos().getPropertyPrefix() + "server.address"] = u.getHost(); - if (u.getPort() != url::UNSPECIFIED_PORT) + if (u.getPort() != utility::url::UNSPECIFIED_PORT) sess->getProperties()[serv->getInfos().getPropertyPrefix() + "server.port"] = u.getPort(); // Path portion of the URL is used to point a specific folder (empty = root). diff --git a/src/messaging/session.cpp b/src/messaging/session.cpp index a1f5d36e..35c188a2 100644 --- a/src/messaging/session.cpp +++ b/src/messaging/session.cpp @@ -64,7 +64,7 @@ transport* session::getTransport(const string& protocol, authenticator* auth) } -transport* session::getTransport(const messaging::url& url, authenticator* auth) +transport* session::getTransport(const utility::url& url, authenticator* auth) { service* sv = serviceFactory::getInstance()->create(this, url, auth); @@ -98,7 +98,7 @@ store* session::getStore(const string& protocol, authenticator* auth) } -store* session::getStore(const messaging::url& url, authenticator* auth) +store* session::getStore(const utility::url& url, authenticator* auth) { service* sv = serviceFactory::getInstance()->create(this, url, auth); diff --git a/src/messaging/url.cpp b/src/messaging/url.cpp deleted file mode 100644 index 1ee9607a..00000000 --- a/src/messaging/url.cpp +++ /dev/null @@ -1,306 +0,0 @@ -// -// 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/messaging/url.hpp" - -#include "vmime/parserHelpers.hpp" -#include "vmime/messaging/urlUtils.hpp" -#include "vmime/exception.hpp" - -#include - - -namespace vmime { -namespace messaging { - - -// 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; - - 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 << 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); - } - - return (oss.str()); -} - - -void url::parse(const string& str) -{ - // Protocol - const string::size_type 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 - string::size_type slashPos = str.find('/', protoEnd + 3); - if (slashPos == string::npos) slashPos = str.length(); - - string::size_type atPos = str.find('@', protoEnd + 3); - 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 string::size_type 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 string::size_type colonPos = hostPart.find(':'); - - string host; - string port; - - if (colonPos == string::npos) - { - host = hostPart; - } - else - { - host = string(hostPart.begin(), hostPart.begin() + colonPos); - port = string(hostPart.begin() + colonPos + 1, hostPart.end()); - } - - // Path - string path = utility::stringUtils::trim(string(str.begin() + slashPos, str.end())); - - if (path == "/") - path.clear(); - - // Some sanity check - if (proto.empty()) - throw exceptions::malformed_url("No protocol specified"); - else if (host.empty() && path.empty()) // Accept empty host (eg. "file:///home/vincent/mydoc") - 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; - - // 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; -} - - -const 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; -} - - -} // messaging -} // vmime diff --git a/src/messaging/urlUtils.cpp b/src/messaging/urlUtils.cpp deleted file mode 100644 index 7dc1e30f..00000000 --- a/src/messaging/urlUtils.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// 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/messaging/urlUtils.hpp" -#include "vmime/parserHelpers.hpp" - - -namespace vmime { -namespace messaging { - - -const string urlUtils::encode(const string& s) -{ - string result; - result.reserve(s.length()); - - for (string::const_iterator it = s.begin() ; it != s.end() ; ++it) - { - const char_t c = *it; - - if (parserHelpers::isPrint(c) && c != '%') - { - result += c; - } - else - { - char hex[4]; - - hex[0] = '%'; - hex[1] = c / 16; - hex[2] = c % 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_t c = *it; - - switch (c) - { - case '%': - { - const char_t p = (++it != s.end() ? *it : 0); - const char_t q = (++it != s.end() ? *it : 0); - - result += static_cast (p * 16 + q); - - if (it != s.end()) - ++it; - - break; - } - default: - - result += c; - ++it; - break; - } - } - - return (result); -} - - -} // messaging -} // vmime diff --git a/src/utility/url.cpp b/src/utility/url.cpp new file mode 100644 index 00000000..0c0a5799 --- /dev/null +++ b/src/utility/url.cpp @@ -0,0 +1,306 @@ +// +// 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/utility/url.hpp" + +#include "vmime/parserHelpers.hpp" +#include "vmime/utility/urlUtils.hpp" +#include "vmime/exception.hpp" + +#include + + +namespace vmime { +namespace utility { + + +// 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; + + 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 << 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); + } + + return (oss.str()); +} + + +void url::parse(const string& str) +{ + // Protocol + const string::size_type 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 + string::size_type slashPos = str.find('/', protoEnd + 3); + if (slashPos == string::npos) slashPos = str.length(); + + string::size_type atPos = str.find('@', protoEnd + 3); + 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 string::size_type 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 string::size_type colonPos = hostPart.find(':'); + + string host; + string port; + + if (colonPos == string::npos) + { + host = hostPart; + } + else + { + host = string(hostPart.begin(), hostPart.begin() + colonPos); + port = string(hostPart.begin() + colonPos + 1, hostPart.end()); + } + + // Path + string path = utility::stringUtils::trim(string(str.begin() + slashPos, str.end())); + + if (path == "/") + path.clear(); + + // Some sanity check + if (proto.empty()) + throw exceptions::malformed_url("No protocol specified"); + else if (host.empty() && path.empty()) // Accept empty host (eg. "file:///home/vincent/mydoc") + 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; + + // 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; +} + + +const 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; +} + + +} // utility +} // vmime diff --git a/src/utility/urlUtils.cpp b/src/utility/urlUtils.cpp new file mode 100644 index 00000000..6099c19b --- /dev/null +++ b/src/utility/urlUtils.cpp @@ -0,0 +1,94 @@ +// +// 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/utility/urlUtils.hpp" +#include "vmime/parserHelpers.hpp" + + +namespace vmime { +namespace utility { + + +const string urlUtils::encode(const string& s) +{ + string result; + result.reserve(s.length()); + + for (string::const_iterator it = s.begin() ; it != s.end() ; ++it) + { + const char_t c = *it; + + if (parserHelpers::isPrint(c) && c != '%') + { + result += c; + } + else + { + char hex[4]; + + hex[0] = '%'; + hex[1] = c / 16; + hex[2] = c % 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_t c = *it; + + switch (c) + { + case '%': + { + const char_t p = (++it != s.end() ? *it : 0); + const char_t q = (++it != s.end() ? *it : 0); + + result += static_cast (p * 16 + q); + + if (it != s.end()) + ++it; + + break; + } + default: + + result += c; + ++it; + break; + } + } + + return (result); +} + + +} // utility +} // vmime diff --git a/vmime/messaging/serviceFactory.hpp b/vmime/messaging/serviceFactory.hpp index 513697c0..5c17afcc 100644 --- a/vmime/messaging/serviceFactory.hpp +++ b/vmime/messaging/serviceFactory.hpp @@ -25,13 +25,14 @@ #include "vmime/types.hpp" #include "vmime/base.hpp" + #include "vmime/utility/stringUtils.hpp" +#include "vmime/utility/url.hpp" #include "vmime/messaging/serviceInfos.hpp" #include "vmime/messaging/authenticator.hpp" #include "vmime/messaging/progressionListener.hpp" #include "vmime/messaging/timeoutHandler.hpp" -#include "vmime/messaging/url.hpp" namespace vmime { @@ -146,7 +147,7 @@ public: * @throw exceptions::no_service_available if no service is registered * for this protocol */ - service* create(session* sess, const url& u, authenticator* auth = NULL); + service* create(session* sess, const utility::url& u, authenticator* auth = NULL); /** Return information about a registered protocol. * diff --git a/vmime/messaging/session.hpp b/vmime/messaging/session.hpp index ae9845c3..958ee448 100644 --- a/vmime/messaging/session.hpp +++ b/vmime/messaging/session.hpp @@ -23,7 +23,7 @@ #include "vmime/messaging/authenticator.hpp" #include "vmime/messaging/progressionListener.hpp" -#include "vmime/messaging/url.hpp" +#include "vmime/utility/url.hpp" #include "vmime/propertySet.hpp" @@ -79,7 +79,7 @@ public: * credentials by reading the session properties "auth.username" and "auth.password". * @return a new transport service */ - transport* getTransport(const messaging::url& url, authenticator* auth = NULL); + transport* getTransport(const utility::url& url, authenticator* auth = NULL); /** Return a transport service instance for the protocol specified * in the session properties. @@ -111,7 +111,7 @@ public: * credentials by reading the session properties "auth.username" and "auth.password". * @return a new store service */ - store* getStore(const messaging::url& url, authenticator* auth = NULL); + store* getStore(const utility::url& url, authenticator* auth = NULL); /** Properties for the session and for the services. */ diff --git a/vmime/messaging/url.hpp b/vmime/messaging/url.hpp deleted file mode 100644 index cd0655fc..00000000 --- a/vmime/messaging/url.hpp +++ /dev/null @@ -1,188 +0,0 @@ -// -// 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_MESSAGING_URL_HPP_INCLUDED -#define VMIME_MESSAGING_URL_HPP_INCLUDED - - -#include "vmime/types.hpp" -#include "vmime/base.hpp" - - -namespace vmime { -namespace messaging { - - -/** This class represents a Uniform Resource Locator (a pointer - * to a "resource" on the World Wide Web). - */ - -class url -{ -public: - - /** Means "port not specified" (use default port). */ - static const port_t UNSPECIFIED_PORT = static_cast (-1); - - /** Standard name for FILE protocol (local file-system). */ - static const string PROTOCOL_FILE; - - /** Standard name for HTTP protocol. */ - static const string PROTOCOL_HTTP; - - /** Standard name for FTP protocol. */ - static const string PROTOCOL_FTP; - - - /** Construct an URL from a string (parse the URL components). - * - * @param s full URL string (eg. http://www.vmime.org:80/download.html - */ - url(const string& s); - - /** Construct an URL from another URL object. - * - * @param u other URL object - */ - url(const url& u); - - /** Construct an URL from the components. - * - * @param protocol protocol (eg. "http", "ftp"...) - * @param host host name (eg. "vmime.sourceforge.net", "123.45.67.89") - * @param port optional port number (eg. 80, 110 or UNSPECIFIED_PORT to mean "default") - * @param path optional full path (eg. "download.html") - * @param username optional user name - * @param password optional user password - */ - url(const string& protocol, const string& host, const port_t port = UNSPECIFIED_PORT, - const string& path = "", const string& username = "", const string& password = ""); - - - /** Return the protocol of the URL (eg: "http"). - * - * @return protocol of the URL - */ - const string& getProtocol() const; - - /** Set the protocol of the URL. - * - * @param protocol new protocol (eg: "http") - */ - void setProtocol(const string& protocol); - - /** Return the username specified in the URL - * or empty if not specified. - * - * @return user name - */ - const string& getUsername() const; - - /** Set the username of the URL. - * - * @param username user name - */ - void setUsername(const string& username); - - /** Return the password specified in the URL - * or empty if not specified. - * - * @return user password - */ - const string& getPassword() const; - - /** Set the password of the URL. - * - * @param password user password - */ - void setPassword(const string& password); - - /** Return the host name of the URL (server name or IP address). - * - * @return host name - */ - const string& getHost() const; - - /** Set the host name of the URL. - * - * @param host server name or IP address - */ - void setHost(const string& host); - - /** Return the port of the URL, or url::UNSPECIFIED_PORT if - * the default port if used. - * - * @return server port - */ - const port_t getPort() const; - - /** Set the port of the URL. - * - * @param port server port or url::UNSPECIFIED_PORT to - * use the default port of the protocol - */ - void setPort(const port_t port); - - /** Return the path portion of the URL, - * or empty if not specified. - * - * @return path - */ - const string& getPath() const; - - /** Set the part portion of the URL. - * - * @param path path - */ - void setPath(const string& path); - - - /** Build a string URL from this object. - */ - operator string() const; - - url& operator=(const url& u); - url& operator=(const string& s); - -private: - - const string build() const; - void parse(const string& str); - - // Format: - // "protocol://[username[:password]@]host[:port][/path]" - - string m_protocol; - - string m_username; - string m_password; - - string m_host; - - port_t m_port; - - string m_path; -}; - - -} // messaging -} // vmime - - -#endif // VMIME_MESSAGING_URL_HPP_INCLUDED diff --git a/vmime/messaging/urlUtils.hpp b/vmime/messaging/urlUtils.hpp deleted file mode 100644 index 6e55d0cf..00000000 --- a/vmime/messaging/urlUtils.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// -// 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_MESSAGING_URLUTILS_HPP_INCLUDED -#define VMIME_MESSAGING_URLUTILS_HPP_INCLUDED - - -#include "vmime/types.hpp" -#include "vmime/base.hpp" - - -namespace vmime { -namespace messaging { - - -/** Miscellaneous functions related to URLs. - */ - -class urlUtils -{ -public: - - /** Encode extended characters in a URL string (ASCII characters - * are unmodified, other are encoded as '%' followed by hex code). - */ - static const string encode(const string& s); - - /** Decode an hex-encoded URL (see encode()). - */ - static const string decode(const string& s); -}; - - -} // messaging -} // vmime - - -#endif // VMIME_MESSAGING_URLUTILS_HPP_INCLUDED diff --git a/vmime/utility/url.hpp b/vmime/utility/url.hpp new file mode 100644 index 00000000..89f63c7b --- /dev/null +++ b/vmime/utility/url.hpp @@ -0,0 +1,189 @@ +// +// 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_UTILITY_URL_HPP_INCLUDED +#define VMIME_UTILITY_URL_HPP_INCLUDED + + +#include "vmime/types.hpp" +#include "vmime/base.hpp" + + +namespace vmime { +namespace utility { + + +/** This class represents a Uniform Resource Locator (a pointer + * to a "resource" on the World Wide Web). + */ + +class url +{ +public: + + /** Means "port not specified" (use default port). */ + static const port_t UNSPECIFIED_PORT = static_cast (-1); + + /** Standard name for FILE protocol (local file-system). */ + static const string PROTOCOL_FILE; + + /** Standard name for HTTP protocol. */ + static const string PROTOCOL_HTTP; + + /** Standard name for FTP protocol. */ + static const string PROTOCOL_FTP; + + + /** Construct an URL from a string (parse the URL components). + * + * @param s full URL string (eg. http://www.vmime.org:80/download.html) + * @throw exceptions::malformed_url if URL is malformed + */ + url(const string& s); + + /** Construct an URL from another URL object. + * + * @param u other URL object + */ + url(const url& u); + + /** Construct an URL from the components. + * + * @param protocol protocol (eg. "http", "ftp"...) + * @param host host name (eg. "vmime.sourceforge.net", "123.45.67.89") + * @param port optional port number (eg. 80, 110 or UNSPECIFIED_PORT to mean "default") + * @param path optional full path (eg. "download.html") + * @param username optional user name + * @param password optional user password + */ + url(const string& protocol, const string& host, const port_t port = UNSPECIFIED_PORT, + const string& path = "", const string& username = "", const string& password = ""); + + + /** Return the protocol of the URL (eg: "http"). + * + * @return protocol of the URL + */ + const string& getProtocol() const; + + /** Set the protocol of the URL. + * + * @param protocol new protocol (eg: "http") + */ + void setProtocol(const string& protocol); + + /** Return the username specified in the URL + * or empty if not specified. + * + * @return user name + */ + const string& getUsername() const; + + /** Set the username of the URL. + * + * @param username user name + */ + void setUsername(const string& username); + + /** Return the password specified in the URL + * or empty if not specified. + * + * @return user password + */ + const string& getPassword() const; + + /** Set the password of the URL. + * + * @param password user password + */ + void setPassword(const string& password); + + /** Return the host name of the URL (server name or IP address). + * + * @return host name + */ + const string& getHost() const; + + /** Set the host name of the URL. + * + * @param host server name or IP address + */ + void setHost(const string& host); + + /** Return the port of the URL, or url::UNSPECIFIED_PORT if + * the default port if used. + * + * @return server port + */ + const port_t getPort() const; + + /** Set the port of the URL. + * + * @param port server port or url::UNSPECIFIED_PORT to + * use the default port of the protocol + */ + void setPort(const port_t port); + + /** Return the path portion of the URL, + * or empty if not specified. + * + * @return path + */ + const string& getPath() const; + + /** Set the part portion of the URL. + * + * @param path path + */ + void setPath(const string& path); + + + /** Build a string URL from this object. + */ + operator string() const; + + url& operator=(const url& u); + url& operator=(const string& s); + +private: + + const string build() const; + void parse(const string& str); + + // Format: + // "protocol://[username[:password]@]host[:port][/path]" + + string m_protocol; + + string m_username; + string m_password; + + string m_host; + + port_t m_port; + + string m_path; +}; + + +} // utility +} // vmime + + +#endif // VMIME_UTILITY_URL_HPP_INCLUDED diff --git a/vmime/utility/urlUtils.hpp b/vmime/utility/urlUtils.hpp new file mode 100644 index 00000000..5f4d2794 --- /dev/null +++ b/vmime/utility/urlUtils.hpp @@ -0,0 +1,54 @@ +// +// 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_UTILITY_URLUTILS_HPP_INCLUDED +#define VMIME_UTILITY_URLUTILS_HPP_INCLUDED + + +#include "vmime/types.hpp" +#include "vmime/base.hpp" + + +namespace vmime { +namespace utility { + + +/** Miscellaneous functions related to URLs. + */ + +class urlUtils +{ +public: + + /** Encode extended characters in a URL string (ASCII characters + * are unmodified, other are encoded as '%' followed by hex code). + */ + static const string encode(const string& s); + + /** Decode an hex-encoded URL (see encode()). + */ + static const string decode(const string& s); +}; + + +} // utility +} // vmime + + +#endif // VMIME_UTILITY_URLUTILS_HPP_INCLUDED -- cgit v1.2.3