vmime/vmime/exception.hpp
2004-12-26 20:23:29 +00:00

746 lines
14 KiB
C++

//
// 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_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