/*
* ====================================================================
* Copyright (c) 2002-2009 The RapidSvn Group. All rights reserved.
*
* 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 3 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 (in the file GPL.txt.
* If not, see .
*
* This software consists of voluntary contributions made by many
* individuals. For exact contribution history, see the revision
* history and logs, available at http://rapidsvn.tigris.org/.
* ====================================================================
*/
// stl
#include "kdevsvncpp/string_wrapper.hpp"
#include
// svncpp
#include "kdevsvncpp/exception.hpp"
namespace svn
{
struct Exception::Data
{
public:
std::string message;
apr_status_t apr_err;
Data(const char * msg)
: message(msg)
{
}
Data(const Data& other)
: message(other.message), apr_err(other.apr_err)
{
}
};
Exception::Exception(const char * message) throw()
{
m = new Data(message);
}
Exception::Exception(const Exception & other) throw()
{
m = new Data(*other.m);
}
Exception::~Exception() throw()
{
delete m;
}
apr_status_t
Exception::apr_err() const
{
return m->apr_err;
}
const char *
Exception::message() const
{
return m->message.c_str();
}
ClientException::ClientException(svn_error_t * error) throw()
: Exception("")
{
if (error == 0)
return;
m->apr_err = error->apr_err;
svn_error_t * next = error->child;
/// @todo send rapidsvn an hint that error->message may sometimes NULL!
std::string & message = m->message;
if (error->message)
message = error->message;
else
{
message = "Unknown error!\n";
if (error->file)
{
message += "In file ";
message += error->file;
std::stringstream num;
num << " Line " << error->line;
message += num.str();
}
}
while (next != NULL && next->message != NULL)
{
message = message + '\n' + next->message;
next = next->child;
}
svn_error_clear(error);
}
ClientException::ClientException(apr_status_t status) throw()
: Exception("")
{
m->apr_err = status;
}
ClientException::~ClientException() throw()
{
}
ClientException::ClientException(const ClientException & src) throw()
: Exception(src.message())
{
}
}
/* -----------------------------------------------------------------
* local variables:
* eval: (load-file "../../rapidsvn-dev.el")
* end:
*/