mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-23 10:22:50 +00:00
123 lines
3.4 KiB
C++
123 lines
3.4 KiB
C++
/*
|
|
Copyright (c) 2009 Volker Krause <vkrause@kde.org>
|
|
|
|
This library is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU Library General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or (at your
|
|
option) any later version.
|
|
|
|
This library 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 Library General Public
|
|
License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to the
|
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301, USA.
|
|
*/
|
|
|
|
#include "exception.h"
|
|
|
|
#include <KDebug>
|
|
#include <QString>
|
|
|
|
#include <memory>
|
|
|
|
using namespace Akonadi;
|
|
|
|
class Exception::Private
|
|
{
|
|
public:
|
|
QByteArray what;
|
|
QByteArray assembledWhat;
|
|
};
|
|
|
|
Exception::Exception(const char *what) throw()
|
|
: d(0)
|
|
{
|
|
try {
|
|
std::auto_ptr<Private> nd(new Private);
|
|
nd->what = what;
|
|
d = nd.release();
|
|
} catch (...) {}
|
|
}
|
|
|
|
Exception::Exception(const QByteArray &what) throw()
|
|
: d(0)
|
|
{
|
|
try {
|
|
std::auto_ptr<Private> nd(new Private);
|
|
nd->what = what;
|
|
d = nd.release();
|
|
} catch (...) {}
|
|
}
|
|
|
|
Exception::Exception(const QString &what) throw()
|
|
: d(0)
|
|
{
|
|
try {
|
|
std::auto_ptr<Private> nd(new Private);
|
|
nd->what = what.toUtf8();
|
|
d = nd.release();
|
|
} catch (...) {}
|
|
}
|
|
|
|
Exception::Exception(const Akonadi::Exception &other) throw()
|
|
: std::exception(other)
|
|
, d(0)
|
|
{
|
|
if (!other.d) {
|
|
return;
|
|
}
|
|
try {
|
|
std::auto_ptr<Private> nd(new Private(*other.d));
|
|
d = nd.release();
|
|
} catch (...) {}
|
|
}
|
|
|
|
Exception::~Exception() throw()
|
|
{
|
|
delete d;
|
|
}
|
|
|
|
QByteArray Exception::type() const throw()
|
|
{
|
|
static const char mytype[] = "Akonadi::Exception";
|
|
try {
|
|
return QByteArray::fromRawData("Akonadi::Exception", sizeof (mytype) - 1);
|
|
} catch (...) {
|
|
return QByteArray();
|
|
}
|
|
}
|
|
|
|
const char *Exception::what() const throw()
|
|
{
|
|
static const char fallback[] = "<some exception was thrown during construction: message lost>";
|
|
if (!d) {
|
|
return fallback;
|
|
}
|
|
if (d->assembledWhat.isEmpty()) {
|
|
try {
|
|
d->assembledWhat = QByteArray(type() + ": " + d->what);
|
|
} catch (...) {
|
|
return "caught some exception while assembling Akonadi::Exception::what() return value";
|
|
}
|
|
}
|
|
return d->assembledWhat.constData();
|
|
}
|
|
|
|
#define AKONADI_EXCEPTION_IMPLEMENT_TRIVIAL_INSTANCE( classname ) \
|
|
Akonadi::classname::~classname() throw() {} \
|
|
QByteArray Akonadi::classname::type() const throw() { \
|
|
static const char mytype[] = "Akonadi::" #classname ; \
|
|
try { \
|
|
return QByteArray::fromRawData( mytype, sizeof (mytype)-1 ); \
|
|
} catch ( ... ) { \
|
|
return QByteArray(); \
|
|
} \
|
|
}
|
|
|
|
AKONADI_EXCEPTION_IMPLEMENT_TRIVIAL_INSTANCE(PayloadException)
|
|
|
|
#undef AKONADI_EXCEPTION_IMPLEMENT_TRIVIAL_INSTANCE
|