using namespace snapper;
+class MetaSnapper;
+
+
struct NoComparison : public std::exception
{
explicit NoComparison() throw() {}
static void introspect(DBus::Connection& conn, DBus::Message& msg);
+ void check_permission(DBus::Connection& conn, DBus::Message& msg) const;
+ void check_permission(DBus::Connection& conn, DBus::Message& msg,
+ const MetaSnapper& meta_snapper) const;
+ void check_lock(DBus::Connection& conn, DBus::Message& msg, const string& config_name) const;
+ void check_in_use(const MetaSnapper& meta_snapper) const;
+
void signal_config_created(DBus::Connection& conn, const string& config_name);
void signal_config_deleted(DBus::Connection& conn, const string& config_name);
void signal_snapshot_created(DBus::Connection& conn, const string& config_name,
void
-check_permission(DBus::Connection& conn, DBus::Message& msg)
+Client::check_permission(DBus::Connection& conn, DBus::Message& msg) const
{
unsigned long uid = conn.get_unix_userid(msg);
if (uid == 0)
void
-check_permission(DBus::Connection& conn, DBus::Message& msg, const MetaSnapper& meta_snapper)
+Client::check_permission(DBus::Connection& conn, DBus::Message& msg,
+ const MetaSnapper& meta_snapper) const
{
unsigned long uid = conn.get_unix_userid(msg);
if (uid == 0)
void
-check_lock(DBus::Connection& conn, DBus::Message& msg, const string& config_name)
+Client::check_lock(DBus::Connection& conn, DBus::Message& msg, const string& config_name) const
{
for (Clients::const_iterator it = clients.begin(); it != clients.end(); ++it)
{
- if (it->zombie || it->name == msg.get_sender())
+ if (it->zombie || &*it == this)
continue;
if (it->has_lock(config_name))
void
-check_in_use(const MetaSnapper& meta_snapper)
+Client::check_in_use(const MetaSnapper& meta_snapper) const
{
if (meta_snapper.use_count() != 0)
throw InUse();
}
+struct UnknownFile : public std::exception
+{
+ explicit UnknownFile() throw() {}
+ virtual const char* what() const throw() { return "unknown config"; }
+};
+
+
void
Client::list_configs(DBus::Connection& conn, DBus::Message& msg)
{
Files& files = comparison->getFiles();
Files::iterator it3 = files.find(filename);
- assert(it3 != files.end());
+ if (it3 == files.end())
+ throw UnknownFile();
lock.unlock();
for (list<Undo>::const_iterator it2 = undos.begin(); it2 != undos.end(); ++it2)
{
Files::iterator it3 = files.find(it2->filename);
- if (it3 != files.end())
- it3->setUndo(it2->undo);
+ if (it3 == files.end())
+ throw UnknownFile();
+
+ it3->setUndo(it2->undo);
}
DBus::MessageMethodReturn reply(msg);
DBus::MessageError reply(msg, "error.illegal_snapshot", DBUS_ERROR_FAILED);
conn.send(reply);
}
+ catch (const UnknownFile& e)
+ {
+ DBus::MessageError reply(msg, "error.unknown_file", DBUS_ERROR_FAILED);
+ conn.send(reply);
+ }
catch (const InvalidUserdataException& e)
{
DBus::MessageError reply(msg, "error.invalid_userdata", DBUS_ERROR_FAILED);