blob: f2f3ceba50ec71b10dc929e12e89d19ca1a758c1 [file] [log] [blame]
// This may look like C code, but it is really -*- C++ -*-
//
// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
// Copyright Dirk Lemstra 2014-2017
//
// Implementation of Exception and derived classes
//
#define MAGICKCORE_IMPLEMENTATION 1
#define MAGICK_PLUSPLUS_IMPLEMENTATION 1
#include "Magick++/Include.h"
#include <string>
#include <errno.h>
#include <string.h>
using namespace std;
#include "Magick++/Exception.h"
Magick::Exception::Exception(const std::string& what_)
: std::exception(),
_what(what_),
_nested((Exception *) NULL)
{
}
Magick::Exception::Exception(const std::string& what_,
Exception* nested_)
: std::exception(),
_what(what_),
_nested(nested_)
{
}
Magick::Exception::Exception(const Magick::Exception& original_)
: exception(original_),
_what(original_._what),
_nested((Exception *) NULL)
{
}
Magick::Exception::~Exception() throw()
{
delete _nested;
}
Magick::Exception& Magick::Exception::operator=(
const Magick::Exception& original_)
{
if (this != &original_)
this->_what=original_._what;
return(*this);
}
const char* Magick::Exception::what() const throw()
{
return(_what.c_str());
}
const Magick::Exception* Magick::Exception::nested() const throw()
{
return(_nested);
}
void Magick::Exception::nested(Exception* nested_) throw()
{
_nested=nested_;
}
Magick::Error::Error(const std::string& what_)
: Exception(what_)
{
}
Magick::Error::Error(const std::string& what_,Exception *nested_)
: Exception(what_,nested_)
{
}
Magick::Error::~Error() throw()
{
}
Magick::ErrorBlob::ErrorBlob(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorBlob::ErrorBlob(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorBlob::~ErrorBlob() throw()
{
}
Magick::ErrorCache::ErrorCache(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorCache::ErrorCache(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorCache::~ErrorCache() throw()
{
}
Magick::ErrorCoder::ErrorCoder(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorCoder::ErrorCoder(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorCoder::~ErrorCoder() throw()
{
}
Magick::ErrorConfigure::ErrorConfigure(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorConfigure::ErrorConfigure(const std::string& what_,
Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorConfigure::~ErrorConfigure() throw()
{
}
Magick::ErrorCorruptImage::ErrorCorruptImage(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorCorruptImage::ErrorCorruptImage(const std::string& what_,
Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorCorruptImage::~ErrorCorruptImage() throw()
{
}
Magick::ErrorDelegate::ErrorDelegate(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorDelegate::ErrorDelegate(const std::string& what_,
Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorDelegate::~ErrorDelegate()throw()
{
}
Magick::ErrorDraw::ErrorDraw(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorDraw::ErrorDraw(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorDraw::~ErrorDraw() throw()
{
}
Magick::ErrorFileOpen::ErrorFileOpen(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorFileOpen::~ErrorFileOpen() throw()
{
}
Magick::ErrorFileOpen::ErrorFileOpen(const std::string& what_,
Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorImage::ErrorImage(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorImage::ErrorImage(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorImage::~ErrorImage() throw()
{
}
Magick::ErrorMissingDelegate::ErrorMissingDelegate(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorMissingDelegate::ErrorMissingDelegate(const std::string& what_,
Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorMissingDelegate::~ErrorMissingDelegate() throw ()
{
}
Magick::ErrorModule::ErrorModule(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorModule::ErrorModule(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorModule::~ErrorModule() throw()
{
}
Magick::ErrorMonitor::ErrorMonitor(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorMonitor::ErrorMonitor(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorMonitor::~ErrorMonitor() throw()
{
}
Magick::ErrorOption::ErrorOption(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorOption::ErrorOption(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorOption::~ErrorOption() throw()
{
}
Magick::ErrorPolicy::ErrorPolicy(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorPolicy::ErrorPolicy(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorPolicy::~ErrorPolicy() throw()
{
}
Magick::ErrorRegistry::ErrorRegistry(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorRegistry::ErrorRegistry(const std::string& what_,
Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorRegistry::~ErrorRegistry() throw()
{
}
Magick::ErrorResourceLimit::ErrorResourceLimit(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorResourceLimit::ErrorResourceLimit(const std::string& what_,
Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorResourceLimit::~ErrorResourceLimit() throw()
{
}
Magick::ErrorStream::ErrorStream(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorStream::ErrorStream(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorStream::~ErrorStream() throw()
{
}
Magick::ErrorType::ErrorType(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorType::ErrorType(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorType::~ErrorType() throw()
{
}
Magick::ErrorUndefined::ErrorUndefined(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorUndefined::ErrorUndefined(const std::string& what_,
Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorUndefined::~ErrorUndefined() throw()
{
}
Magick::ErrorXServer::ErrorXServer(const std::string& what_)
: Error(what_)
{
}
Magick::ErrorXServer::ErrorXServer(const std::string& what_,Exception *nested_)
: Error(what_,nested_)
{
}
Magick::ErrorXServer::~ErrorXServer() throw ()
{
}
Magick::Warning::Warning(const std::string& what_)
: Exception(what_)
{
}
Magick::Warning::Warning(const std::string& what_,Exception *nested_)
: Exception(what_,nested_)
{
}
Magick::Warning::~Warning() throw()
{
}
Magick::WarningBlob::WarningBlob(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningBlob::WarningBlob(const std::string& what_,Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningBlob::~WarningBlob() throw()
{
}
Magick::WarningCache::WarningCache(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningCache::WarningCache(const std::string& what_,Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningCache::~WarningCache() throw()
{
}
Magick::WarningCoder::WarningCoder(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningCoder::WarningCoder(const std::string& what_,Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningCoder::~WarningCoder() throw()
{
}
Magick::WarningConfigure::WarningConfigure(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningConfigure::WarningConfigure(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningConfigure::~WarningConfigure() throw()
{
}
Magick::WarningCorruptImage::WarningCorruptImage(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningCorruptImage::WarningCorruptImage(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningCorruptImage::~WarningCorruptImage() throw()
{
}
Magick::WarningDelegate::WarningDelegate(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningDelegate::WarningDelegate(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningDelegate::~WarningDelegate() throw()
{
}
Magick::WarningDraw::WarningDraw(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningDraw::WarningDraw(const std::string& what_,Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningDraw::~WarningDraw() throw()
{
}
Magick::WarningFileOpen::WarningFileOpen(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningFileOpen::WarningFileOpen(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningFileOpen::~WarningFileOpen() throw()
{
}
Magick::WarningImage::WarningImage(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningImage::WarningImage(const std::string& what_,Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningImage::~WarningImage() throw()
{
}
Magick::WarningMissingDelegate::WarningMissingDelegate(
const std::string& what_)
: Warning(what_)
{
}
Magick::WarningMissingDelegate::WarningMissingDelegate(
const std::string& what_,Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningMissingDelegate::~WarningMissingDelegate() throw()
{
}
Magick::WarningModule::WarningModule(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningModule::WarningModule(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningModule::~WarningModule() throw()
{
}
Magick::WarningMonitor::WarningMonitor(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningMonitor::WarningMonitor(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningMonitor::~WarningMonitor() throw()
{
}
Magick::WarningOption::WarningOption(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningOption::WarningOption(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningOption::~WarningOption() throw()
{
}
Magick::WarningRegistry::WarningRegistry(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningRegistry::WarningRegistry(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningRegistry::~WarningRegistry() throw()
{
}
Magick::WarningPolicy::WarningPolicy(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningPolicy::WarningPolicy(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningPolicy::~WarningPolicy() throw()
{
}
Magick::WarningResourceLimit::WarningResourceLimit(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningResourceLimit::WarningResourceLimit(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningResourceLimit::~WarningResourceLimit() throw()
{
}
Magick::WarningStream::WarningStream(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningStream::WarningStream(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningStream::~WarningStream() throw()
{
}
Magick::WarningType::WarningType(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningType::WarningType(const std::string& what_,Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningType::~WarningType() throw()
{
}
Magick::WarningUndefined::WarningUndefined(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningUndefined::WarningUndefined(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningUndefined::~WarningUndefined() throw()
{
}
Magick::WarningXServer::WarningXServer(const std::string& what_)
: Warning(what_)
{
}
Magick::WarningXServer::WarningXServer(const std::string& what_,
Exception *nested_)
: Warning(what_,nested_)
{
}
Magick::WarningXServer::~WarningXServer() throw()
{
}
std::string Magick::formatExceptionMessage(const MagickCore::ExceptionInfo *exception_)
{
// Format error message ImageMagick-style
std::string message=GetClientName();
if (exception_->reason != (char *) NULL)
{
message+=std::string(": ");
message+=std::string(exception_->reason);
}
if (exception_->description != (char *) NULL)
message += " (" + std::string(exception_->description) + ")";
return(message);
}
Magick::Exception* Magick::createException(const MagickCore::ExceptionInfo *exception_)
{
std::string message=formatExceptionMessage(exception_);
switch (exception_->severity)
{
case MagickCore::BlobError:
case MagickCore::BlobFatalError:
return new ErrorBlob(message);
case MagickCore::BlobWarning:
return new WarningBlob(message);
case MagickCore::CacheError:
case MagickCore::CacheFatalError:
return new ErrorCache(message);
case MagickCore::CacheWarning:
return new WarningCache(message);
case MagickCore::CoderError:
case MagickCore::CoderFatalError:
return new ErrorCoder(message);
case MagickCore::CoderWarning:
return new WarningCoder(message);
case MagickCore::ConfigureError:
case MagickCore::ConfigureFatalError:
return new ErrorConfigure(message);
case MagickCore::ConfigureWarning:
return new WarningConfigure(message);
case MagickCore::CorruptImageError:
case MagickCore::CorruptImageFatalError:
return new ErrorCorruptImage(message);
case MagickCore::CorruptImageWarning:
return new WarningCorruptImage(message);
case MagickCore::DelegateError:
case MagickCore::DelegateFatalError:
return new ErrorDelegate(message);
case MagickCore::DelegateWarning:
return new WarningDelegate(message);
case MagickCore::DrawError:
case MagickCore::DrawFatalError:
return new ErrorDraw(message);
case MagickCore::DrawWarning:
return new WarningDraw(message);
case MagickCore::FileOpenError:
case MagickCore::FileOpenFatalError:
return new ErrorFileOpen(message);
case MagickCore::FileOpenWarning:
return new WarningFileOpen(message);
case MagickCore::ImageError:
case MagickCore::ImageFatalError:
return new ErrorImage(message);
case MagickCore::ImageWarning:
return new WarningImage(message);
case MagickCore::MissingDelegateError:
case MagickCore::MissingDelegateFatalError:
return new ErrorMissingDelegate(message);
case MagickCore::MissingDelegateWarning:
return new WarningMissingDelegate(message);
case MagickCore::ModuleError:
case MagickCore::ModuleFatalError:
return new ErrorModule(message);
case MagickCore::ModuleWarning:
return new WarningModule(message);
case MagickCore::MonitorError:
case MagickCore::MonitorFatalError:
return new ErrorMonitor(message);
case MagickCore::MonitorWarning:
return new WarningMonitor(message);
case MagickCore::OptionError:
case MagickCore::OptionFatalError:
return new ErrorOption(message);
case MagickCore::OptionWarning:
return new WarningOption(message);
case MagickCore::PolicyWarning:
return new WarningPolicy(message);
case MagickCore::PolicyError:
case MagickCore::PolicyFatalError:
return new ErrorPolicy(message);
case MagickCore::RegistryError:
case MagickCore::RegistryFatalError:
return new ErrorRegistry(message);
case MagickCore::RegistryWarning:
return new WarningRegistry(message);
case MagickCore::ResourceLimitError:
case MagickCore::ResourceLimitFatalError:
return new ErrorResourceLimit(message);
case MagickCore::ResourceLimitWarning:
return new WarningResourceLimit(message);
case MagickCore::StreamError:
case MagickCore::StreamFatalError:
return new ErrorStream(message);
case MagickCore::StreamWarning:
return new WarningStream(message);
case MagickCore::TypeError:
case MagickCore::TypeFatalError:
return new ErrorType(message);
case MagickCore::TypeWarning:
return new WarningType(message);
case MagickCore::UndefinedException:
default:
return new ErrorUndefined(message);
case MagickCore::XServerError:
case MagickCore::XServerFatalError:
return new ErrorXServer(message);
case MagickCore::XServerWarning:
return new WarningXServer(message);
}
}
MagickPPExport void Magick::throwExceptionExplicit(
const MagickCore::ExceptionType severity_,const char* reason_,
const char* description_)
{
// Just return if there is no reported error
if (severity_ == MagickCore::UndefinedException)
return;
GetPPException;
ThrowException(exceptionInfo,severity_,reason_,description_);
ThrowPPException(false);
}
MagickPPExport void Magick::throwException(ExceptionInfo *exception_,
const bool quiet_)
{
const ExceptionInfo
*p;
Exception
*nestedException,
*q;
MagickCore::ExceptionType
severity;
size_t
index;
std::string
message;
// Just return if there is no reported error
if (exception_->severity == MagickCore::UndefinedException)
return;
message=formatExceptionMessage(exception_);
nestedException=(Exception *) NULL;
q=(Exception *) NULL;
LockSemaphoreInfo(exception_->semaphore);
if (exception_->exceptions != (void *) NULL)
{
index=GetNumberOfElementsInLinkedList((LinkedListInfo *)
exception_->exceptions);
while(index > 0)
{
p=(const ExceptionInfo *) GetValueFromLinkedList((LinkedListInfo *)
exception_->exceptions,--index);
if ((p->severity != exception_->severity) || (LocaleCompare(p->reason,
exception_->reason) != 0) || (LocaleCompare(p->description,
exception_->description) != 0))
{
if (nestedException == (Exception *) NULL)
{
nestedException=createException(p);
q=nestedException;
}
else
{
Exception
*r;
r=createException(p);
q->nested(r);
q=r;
}
}
}
}
severity=exception_->severity;
UnlockSemaphoreInfo(exception_->semaphore);
if ((quiet_) && (severity < MagickCore::ErrorException))
{
delete nestedException;
return;
}
DestroyExceptionInfo(exception_);
switch (severity)
{
case MagickCore::BlobError:
case MagickCore::BlobFatalError:
throw ErrorBlob(message,nestedException);
case MagickCore::BlobWarning:
throw WarningBlob(message,nestedException);
case MagickCore::CacheError:
case MagickCore::CacheFatalError:
throw ErrorCache(message,nestedException);
case MagickCore::CacheWarning:
throw WarningCache(message,nestedException);
case MagickCore::CoderError:
case MagickCore::CoderFatalError:
throw ErrorCoder(message,nestedException);
case MagickCore::CoderWarning:
throw WarningCoder(message,nestedException);
case MagickCore::ConfigureError:
case MagickCore::ConfigureFatalError:
throw ErrorConfigure(message,nestedException);
case MagickCore::ConfigureWarning:
throw WarningConfigure(message,nestedException);
case MagickCore::CorruptImageError:
case MagickCore::CorruptImageFatalError:
throw ErrorCorruptImage(message,nestedException);
case MagickCore::CorruptImageWarning:
throw WarningCorruptImage(message,nestedException);
case MagickCore::DelegateError:
case MagickCore::DelegateFatalError:
throw ErrorDelegate(message,nestedException);
case MagickCore::DelegateWarning:
throw WarningDelegate(message,nestedException);
case MagickCore::DrawError:
case MagickCore::DrawFatalError:
throw ErrorDraw(message,nestedException);
case MagickCore::DrawWarning:
throw WarningDraw(message,nestedException);
case MagickCore::FileOpenError:
case MagickCore::FileOpenFatalError:
throw ErrorFileOpen(message,nestedException);
case MagickCore::FileOpenWarning:
throw WarningFileOpen(message,nestedException);
case MagickCore::ImageError:
case MagickCore::ImageFatalError:
throw ErrorImage(message,nestedException);
case MagickCore::ImageWarning:
throw WarningImage(message,nestedException);
case MagickCore::MissingDelegateError:
case MagickCore::MissingDelegateFatalError:
throw ErrorMissingDelegate(message,nestedException);
case MagickCore::MissingDelegateWarning:
throw WarningMissingDelegate(message,nestedException);
case MagickCore::ModuleError:
case MagickCore::ModuleFatalError:
throw ErrorModule(message,nestedException);
case MagickCore::ModuleWarning:
throw WarningModule(message,nestedException);
case MagickCore::MonitorError:
case MagickCore::MonitorFatalError:
throw ErrorMonitor(message,nestedException);
case MagickCore::MonitorWarning:
throw WarningMonitor(message,nestedException);
case MagickCore::OptionError:
case MagickCore::OptionFatalError:
throw ErrorOption(message,nestedException);
case MagickCore::OptionWarning:
throw WarningOption(message,nestedException);
case MagickCore::PolicyWarning:
throw WarningPolicy(message,nestedException);
case MagickCore::PolicyError:
case MagickCore::PolicyFatalError:
throw ErrorPolicy(message,nestedException);
case MagickCore::RegistryError:
case MagickCore::RegistryFatalError:
throw ErrorRegistry(message,nestedException);
case MagickCore::RegistryWarning:
throw WarningRegistry(message,nestedException);
case MagickCore::ResourceLimitError:
case MagickCore::ResourceLimitFatalError:
throw ErrorResourceLimit(message,nestedException);
case MagickCore::ResourceLimitWarning:
throw WarningResourceLimit(message,nestedException);
case MagickCore::StreamError:
case MagickCore::StreamFatalError:
throw ErrorStream(message,nestedException);
case MagickCore::StreamWarning:
throw WarningStream(message,nestedException);
case MagickCore::TypeError:
case MagickCore::TypeFatalError:
throw ErrorType(message,nestedException);
case MagickCore::TypeWarning:
throw WarningType(message,nestedException);
case MagickCore::UndefinedException:
default:
throw ErrorUndefined(message,nestedException);
case MagickCore::XServerError:
case MagickCore::XServerFatalError:
throw ErrorXServer(message,nestedException);
case MagickCore::XServerWarning:
throw WarningXServer(message,nestedException);
}
}