diff options
Diffstat (limited to 'vmime/exception.hpp')
| -rw-r--r-- | vmime/exception.hpp | 745 |
1 files changed, 745 insertions, 0 deletions
diff --git a/vmime/exception.hpp b/vmime/exception.hpp new file mode 100644 index 00000000..040df7b3 --- /dev/null +++ b/vmime/exception.hpp @@ -0,0 +1,745 @@ +// +// 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_EXCEPTION_HPP_INCLUDED +#define VMIME_EXCEPTION_HPP_INCLUDED + + +#include "vmime/config.hpp" +#include "vmime/base.hpp" +#include "vmime/utility/path.hpp" + + +namespace vmime +{ + + +/** Base class for VMime exceptions. + */ + +class exception +{ +private: + + string m_what; + exception* m_other; + + exception(); + +public: + + exception(const string& what, const exception& other = NO_EXCEPTION); + virtual ~exception(); + + /** Return a description of the error. + * + * @return error message + */ + const string what() const throw(); + + /** Return the next exception in the chain (encapsuled exception). + * + * @return next exception in the chain + */ + const exception* other() const; + + /** Return a name identifying the exception. + * + * @return exception name + */ + virtual const string name() const; + +protected: + + static const exception NO_EXCEPTION; + + virtual exception* clone() const; +}; + + + +/** List of all VMime exceptions. */ + +namespace exceptions +{ + + +class bad_field_type : public vmime::exception +{ +public: + + bad_field_type(const exception& other = NO_EXCEPTION); + ~bad_field_type() throw(); + + exception* clone() const; + const string name() const; +}; + + +class charset_conv_error : public vmime::exception +{ +public: + + charset_conv_error(const exception& other = NO_EXCEPTION); + ~charset_conv_error() throw(); + + exception* clone() const; + const string name() const; +}; + + +class no_encoder_available : public vmime::exception +{ +public: + + no_encoder_available(const exception& other = NO_EXCEPTION); + ~no_encoder_available() throw(); + + exception* clone() const; + const string name() const; +}; + + +class no_such_parameter : public vmime::exception +{ +public: + + no_such_parameter(const string& name, const exception& other = NO_EXCEPTION); + ~no_such_parameter() throw(); + + exception* clone() const; + const string name() const; +}; + + +class no_such_field : public vmime::exception +{ +public: + + no_such_field(const exception& other = NO_EXCEPTION); + ~no_such_field() throw(); + + exception* clone() const; + const string name() const; +}; + + +class no_such_part : public vmime::exception +{ +public: + + no_such_part(const exception& other = NO_EXCEPTION); + ~no_such_part() throw(); + + exception* clone() const; + const string name() const; +}; + + +class no_such_mailbox : public vmime::exception +{ +public: + + no_such_mailbox(const exception& other = NO_EXCEPTION); + ~no_such_mailbox() throw(); + + exception* clone() const; + const string name() const; +}; + + +class no_such_address : public vmime::exception +{ +public: + + no_such_address(const exception& other = NO_EXCEPTION); + ~no_such_address() throw(); + + exception* clone() const; + const string name() const; +}; + + +class open_file_error : public vmime::exception +{ +public: + + open_file_error(const exception& other = NO_EXCEPTION); + ~open_file_error() throw(); + + exception* clone() const; + const string name() const; +}; + + +class no_factory_available : public vmime::exception +{ +public: + + no_factory_available(const exception& other = NO_EXCEPTION); + ~no_factory_available() throw(); + + exception* clone() const; + const string name() const; +}; + + +class no_platform_dependant_handler : public vmime::exception +{ +public: + + no_platform_dependant_handler(const exception& other = NO_EXCEPTION); + ~no_platform_dependant_handler() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** No expeditor specified. + */ + +class no_expeditor : public vmime::exception +{ +public: + + no_expeditor(const exception& other = NO_EXCEPTION); + ~no_expeditor() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** No recipient specified. + */ + +class no_recipient : public vmime::exception +{ +public: + + no_recipient(const exception& other = NO_EXCEPTION); + ~no_recipient() throw(); + + exception* clone() const; + const string name() const; +}; + + +class no_object_found : public vmime::exception +{ +public: + + no_object_found(const exception& other = NO_EXCEPTION); + ~no_object_found() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** There is no property with that name in the set. + */ + +class no_such_property : public vmime::exception +{ +public: + + no_such_property(const string& name, const exception& other = NO_EXCEPTION); + ~no_such_property() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Bad type specified when reading property. + */ + +class invalid_property_type : public vmime::exception +{ +public: + + invalid_property_type(const exception& other = NO_EXCEPTION); + ~invalid_property_type() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Bad argument was passed to the function. + */ + +class invalid_argument : public vmime::exception +{ +public: + + invalid_argument(const exception& other = NO_EXCEPTION); + ~invalid_argument() throw(); + + exception* clone() const; + const string name() const; +}; + + + +#if VMIME_HAVE_MESSAGING_FEATURES + + +/** Base class for exceptions thrown by the messaging module. + */ + +class messaging_exception : public vmime::exception +{ +public: + + messaging_exception(const string& what, const exception& other = NO_EXCEPTION); + ~messaging_exception() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Error while connecting to the server: this may be a DNS resolution error + * or a connection error (for example, time-out while connecting). + */ + +class connection_error : public messaging_exception +{ +public: + + connection_error(const exception& other = NO_EXCEPTION); + ~connection_error() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Server did not initiated the connection correctly. + */ + +class connection_greeting_error : public messaging_exception +{ +public: + + connection_greeting_error(const string& response, const exception& other = NO_EXCEPTION); + ~connection_greeting_error() throw(); + + const string& response() const; + + exception* clone() const; + const string name() const; + +private: + + string m_response; +}; + + +/** Error while giving credentials to the server (wrong username + * or password, or wrong authentication method). + */ + +class authentication_error : public messaging_exception +{ +public: + + authentication_error(const string& response, const exception& other = NO_EXCEPTION); + ~authentication_error() throw(); + + const string& response() const; + + exception* clone() const; + const string name() const; + +private: + + string m_response; +}; + + +/** Option not supported. + */ + +class unsupported_option : public messaging_exception +{ +public: + + unsupported_option(const exception& other = NO_EXCEPTION); + ~unsupported_option() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** No service available for this protocol. + */ + +class no_service_available : public messaging_exception +{ +public: + + no_service_available(const string& proto = "", const exception& other = NO_EXCEPTION); + ~no_service_available() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** The current state of the object does not permit to execute the + * operation (for example, you try to close a folder which is not open). + */ + +class illegal_state : public messaging_exception +{ +public: + + illegal_state(const string& state, const exception& other = NO_EXCEPTION); + ~illegal_state() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Folder not found (does not exist). + */ + +class folder_not_found : public messaging_exception +{ +public: + + folder_not_found(const exception& other = NO_EXCEPTION); + ~folder_not_found() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Message not found (does not exist). + */ + +class message_not_found : public messaging_exception +{ +public: + + message_not_found(const exception& other = NO_EXCEPTION); + ~message_not_found() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Operation not supported by the underlying protocol. + */ + +class operation_not_supported : public messaging_exception +{ +public: + + operation_not_supported(const exception& other = NO_EXCEPTION); + ~operation_not_supported() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** The operation timed out (time-out delay is elapsed). + */ + +class operation_timed_out : public messaging_exception +{ +public: + + operation_timed_out(const exception& other = NO_EXCEPTION); + ~operation_timed_out() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** The operation has been cancelled. + */ + +class operation_cancelled : public messaging_exception +{ +public: + + operation_cancelled(const exception& other = NO_EXCEPTION); + ~operation_cancelled() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Must call fetchMessage() or fetchHeader() before accessing + * the requested object. + */ + +class unfetched_object : public messaging_exception +{ +public: + + unfetched_object(const exception& other = NO_EXCEPTION); + ~unfetched_object() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** The service is not currently connected. + */ + +class not_connected : public messaging_exception +{ +public: + + not_connected(const exception& other = NO_EXCEPTION); + ~not_connected() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** The service is already connected (must disconnect before). + */ + +class already_connected : public messaging_exception +{ +public: + + already_connected(const exception& other = NO_EXCEPTION); + ~already_connected() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Illegal operation: cannot run this operation on the object. + */ + +class illegal_operation : public messaging_exception +{ +public: + + illegal_operation(const string& msg = "", const exception& other = NO_EXCEPTION); + ~illegal_operation() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Command error: operation failed (this is specific to the underlying protocol). + */ + +class command_error : public messaging_exception +{ +public: + + command_error(const string& command, const string& response, const string& desc = "", const exception& other = NO_EXCEPTION); + ~command_error() throw(); + + /** Return the name of the command which have thrown the exception. + * This is protocol-dependant. + * + * @return command name (protocol-dependant) + */ + const string& command() const; + + /** Return the invalid response line. + * The meaning is protocol-dependant. + * + * @return response line (protocol-dependant) + */ + const string& response() const; + + exception* clone() const; + const string name() const; + +private: + + string m_command; + string m_response; +}; + + +/** The server returned an invalid response. + */ + +class invalid_response : public messaging_exception +{ +public: + + invalid_response(const string& command, const string& response, const exception& other = NO_EXCEPTION); + ~invalid_response() throw(); + + /** Return the name of the command which have thrown the exception. + * This is protocol-dependant. + * + * @return command name (protocol-dependant) + */ + const string& command() const; + + /** Return the invalid response line. + * The meaning is protocol-dependant. + * + * @return response line (protocol-dependant) + */ + const string& response() const; + + exception* clone() const; + const string name() const; + +private: + + string m_command; + string m_response; +}; + + +/** Partial fetch is not supported by the underlying protocol. + */ + +class partial_fetch_not_supported : public messaging_exception +{ +public: + + partial_fetch_not_supported(const exception& other = NO_EXCEPTION); + ~partial_fetch_not_supported() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** The URL is malformed. + */ + +class malformed_url : public messaging_exception +{ +public: + + malformed_url(const string& error, const exception& other = NO_EXCEPTION); + ~malformed_url() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** Folder name is invalid. + */ + +class invalid_folder_name : public messaging_exception +{ +public: + + invalid_folder_name(const string& error = "", const exception& other = NO_EXCEPTION); + ~invalid_folder_name() throw(); + + exception* clone() const; + const string name() const; +}; + + +#endif // VMIME_HAVE_MESSAGING_FEATURES + + +#if VMIME_HAVE_FILESYSTEM_FEATURES + + +/** Base class for exceptions thrown by the filesystem features. + */ + +class filesystem_exception : public vmime::exception +{ +public: + + filesystem_exception(const string& what, const utility::path& path, const exception& other = NO_EXCEPTION); + ~filesystem_exception() throw(); + + /** Return the full path of the file have thrown the exception. + * + * @return full path of the file/directory + */ + const utility::path& path() const; + + exception* clone() const; + const string name() const; + +private: + + const utility::path m_path; +}; + + +/** File is not a directory. + */ + +class not_a_directory : public filesystem_exception +{ +public: + + not_a_directory(const utility::path& path, const exception& other = NO_EXCEPTION); + ~not_a_directory() throw(); + + exception* clone() const; + const string name() const; +}; + + +/** File not found. + */ + +class file_not_found : public filesystem_exception +{ +public: + + file_not_found(const utility::path& path, const exception& other = NO_EXCEPTION); + ~file_not_found() throw(); + + exception* clone() const; + const string name() const; +}; + + +#endif // VMIME_HAVE_FILESYSTEM_FEATURES + + +} // exceptions + + +} // vmime + + +#endif // VMIME_EXCEPTION_HPP_INCLUDED |
