exception: move sd_bus_error_set calls to exception

In the future, generated exceptions will need to fill the sd_error
with something other than the "description" in order to pass more
metadata.  Move the sd_bus_error_set calls to exception as a virtual
function so this can be accomplished.

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: I6e6947e4977701a8e7e27fef119bd35e837d866b
diff --git a/include/sdbusplus/asio/object_server.hpp b/include/sdbusplus/asio/object_server.hpp
index c35413d..6275d46 100644
--- a/include/sdbusplus/asio/object_server.hpp
+++ b/include/sdbusplus/asio/object_server.hpp
@@ -641,7 +641,7 @@
 
         catch (const sdbusplus::exception_t& e)
         {
-            return sd_bus_error_set(error, e.name(), e.description());
+            return e.set_error(error);
         }
         catch (...)
         {
@@ -681,7 +681,7 @@
 
         catch (const sdbusplus::exception_t& e)
         {
-            return sd_bus_error_set(error, e.name(), e.description());
+            return e.set_error(error);
         }
         catch (...)
         {
@@ -711,7 +711,7 @@
 
         catch (const sdbusplus::exception_t& e)
         {
-            return sd_bus_error_set(error, e.name(), e.description());
+            return e.set_error(error);
         }
         catch (...)
         {
diff --git a/include/sdbusplus/exception.hpp b/include/sdbusplus/exception.hpp
index 3b01466..0ba477c 100644
--- a/include/sdbusplus/exception.hpp
+++ b/include/sdbusplus/exception.hpp
@@ -28,6 +28,9 @@
     virtual const char* description() const noexcept = 0;
     virtual int get_errno() const noexcept = 0;
 
+    virtual int set_error(sd_bus_error*) const;
+    virtual int set_error(SdBusInterface*, sd_bus_error*) const;
+
   private:
     // This unused function is to ensure that the vtable for this class is
     // properly emitted when `-flto=auto` is used, which is the default in
diff --git a/include/sdbusplus/message.hpp b/include/sdbusplus/message.hpp
index 4e5f790..fa3f690 100644
--- a/include/sdbusplus/message.hpp
+++ b/include/sdbusplus/message.hpp
@@ -368,8 +368,11 @@
     message new_method_error(const sdbusplus::exception::exception& e)
     {
         msgp_t reply = nullptr;
-        int r = _intf->sd_bus_message_new_method_error(
-            this->get(), &reply, e.name(), e.description());
+        sd_bus_error error = SD_BUS_ERROR_NULL;
+        e.set_error(_intf, &error);
+        int r =
+            _intf->sd_bus_message_new_method_error(this->get(), &reply, &error);
+        sd_bus_error_free(&error);
         if (r < 0)
         {
             throw exception::SdBusError(-r, "sd_bus_message_new_method_error");
diff --git a/include/sdbusplus/sdbus.hpp b/include/sdbusplus/sdbus.hpp
index a5d2cfd..fae1d2e 100644
--- a/include/sdbusplus/sdbus.hpp
+++ b/include/sdbusplus/sdbus.hpp
@@ -115,8 +115,7 @@
                                                  sd_bus_message** m) = 0;
 
     virtual int sd_bus_message_new_method_error(
-        sd_bus_message* call, sd_bus_message** m, const char* name,
-        const char* description) = 0;
+        sd_bus_message* call, sd_bus_message** m, sd_bus_error* e) = 0;
 
     virtual int sd_bus_message_new_method_errno(sd_bus_message* call,
                                                 sd_bus_message** m, int error,
@@ -440,12 +439,10 @@
         return ::sd_bus_message_new_method_return(call, m);
     }
 
-    int sd_bus_message_new_method_error(sd_bus_message* call,
-                                        sd_bus_message** m, const char* name,
-                                        const char* description) override
+    int sd_bus_message_new_method_error(
+        sd_bus_message* call, sd_bus_message** m, sd_bus_error* e) override
     {
-        return ::sd_bus_message_new_method_errorf(call, m, name, "%s",
-                                                  description);
+        return ::sd_bus_message_new_method_error(call, m, e);
     }
 
     int sd_bus_message_new_method_errno(sd_bus_message* call,
diff --git a/include/sdbusplus/sdbuspp_support/server.hpp b/include/sdbusplus/sdbuspp_support/server.hpp
index 3cf78e9..f2865f6 100644
--- a/include/sdbusplus/sdbuspp_support/server.hpp
+++ b/include/sdbusplus/sdbuspp_support/server.hpp
@@ -53,7 +53,7 @@
     }
     catch (const sdbusplus::internal_exception_t& e)
     {
-        return intf->sd_bus_error_set(error, e.name(), e.description());
+        return e.set_error(intf, error);
     }
 
     // A positive integer must be returned to indicate that the callback
@@ -126,7 +126,7 @@
     }
     catch (const sdbusplus::internal_exception_t& e)
     {
-        return intf->sd_bus_error_set(error, e.name(), e.description());
+        return e.set_error(intf, error);
     }
 
     // A positive integer must be returned to indicate that the callback
diff --git a/include/sdbusplus/test/sdbus_mock.hpp b/include/sdbusplus/test/sdbus_mock.hpp
index 6e1a1a3..c555dc1 100644
--- a/include/sdbusplus/test/sdbus_mock.hpp
+++ b/include/sdbusplus/test/sdbus_mock.hpp
@@ -117,8 +117,7 @@
                 (sd_bus_message*, sd_bus_message**), (override));
 
     MOCK_METHOD(int, sd_bus_message_new_method_error,
-                (sd_bus_message * call, sd_bus_message** m, const char* name,
-                 const char* description),
+                (sd_bus_message * call, sd_bus_message** m, sd_bus_error* e),
                 (override));
 
     MOCK_METHOD(int, sd_bus_message_new_method_errno,
diff --git a/src/exception.cpp b/src/exception.cpp
index c03e2bf..565e059 100644
--- a/src/exception.cpp
+++ b/src/exception.cpp
@@ -16,6 +16,16 @@
 
 void exception::unused() const noexcept {}
 
+int exception::set_error(sd_bus_error* e) const
+{
+    return sd_bus_error_set(e, name(), description());
+}
+
+int exception::set_error(SdBusInterface* i, sd_bus_error* e) const
+{
+    return i->sd_bus_error_set(e, name(), description());
+}
+
 int generated_exception::get_errno() const noexcept
 {
     return EIO;
diff --git a/tools/sdbusplus/templates/method.aserver.callback.hpp.mako b/tools/sdbusplus/templates/method.aserver.callback.hpp.mako
index 20ad4ad..27d36d7 100644
--- a/tools/sdbusplus/templates/method.aserver.callback.hpp.mako
+++ b/tools/sdbusplus/templates/method.aserver.callback.hpp.mako
@@ -231,7 +231,7 @@
 % for e in method.errors:
         catch(const ${interface.errorNamespacedClass(e)}& e)
         {
-            return sd_bus_error_set(error, e.name(), e.description());
+            return e.set_error(error);
         }
 % endfor
         catch(const std::exception&)
diff --git a/tools/sdbusplus/templates/method.prototype.hpp.mako b/tools/sdbusplus/templates/method.prototype.hpp.mako
index 74d0cbc..9dd232f 100644
--- a/tools/sdbusplus/templates/method.prototype.hpp.mako
+++ b/tools/sdbusplus/templates/method.prototype.hpp.mako
@@ -56,7 +56,7 @@
     % for e in method.errors:
     catch(const ${interface.errorNamespacedClass(e)}& e)
     {
-        return o->get_bus().getInterface()->sd_bus_error_set(error, e.name(), e.description());
+        return e.set_error(o->get_bus().getInterface(), error);
     }
     % endfor
     catch (const std::exception&)
diff --git a/tools/sdbusplus/templates/property.aserver.callback.hpp.mako b/tools/sdbusplus/templates/property.aserver.callback.hpp.mako
index 58f3df4..39dda8a 100644
--- a/tools/sdbusplus/templates/property.aserver.callback.hpp.mako
+++ b/tools/sdbusplus/templates/property.aserver.callback.hpp.mako
@@ -38,7 +38,7 @@
         % for e in property.errors:
         catch (const ${interface.errorNamespacedClass(e)}& e)
         {
-            return sd_bus_error_set(error, e.name(), e.description());
+            return e.set_error(error);
         }
         % endfor
         catch (const std::exception&)
@@ -82,7 +82,7 @@
         % for e in property.errors:
         catch (const ${interface.errorNamespacedClass(e)}& e)
         {
-            return sd_bus_error_set(error, e.name(), e.description());
+            return e.set_error(error);
         }
         % endfor
         catch (const std::exception&)
diff --git a/tools/sdbusplus/templates/property.server.cpp.mako b/tools/sdbusplus/templates/property.server.cpp.mako
index 3b5b64d..8d851c8 100644
--- a/tools/sdbusplus/templates/property.server.cpp.mako
+++ b/tools/sdbusplus/templates/property.server.cpp.mako
@@ -25,7 +25,7 @@
     % for e in property.errors:
     catch(const ${interface.errorNamespacedClass(e)}& e)
     {
-        return o->get_bus().getInterface()->sd_bus_error_set(error, e.name(), e.description());
+        return e.set_error(o->get_bus().getInterface(), error);
     }
     % endfor
     catch (const std::exception&)
@@ -79,7 +79,7 @@
     % for e in property.errors:
     catch(const ${interface.errorNamespacedClass(e)}& e)
     {
-        return o->get_bus().getInterface()->sd_bus_error_set(error, e.name(), e.description());
+        return e.set_error(o->get_bus().getInterface(), error);
     }
     % endfor
     catch (const std::exception&)