Switch to side-by-side view

--- a/libupnpp/device/device.cxx
+++ b/libupnpp/device/device.cxx
@@ -20,6 +20,7 @@
 
 #include <errno.h>
 #include <time.h>
+#include <string.h>
 
 #include <iostream>
 #include <sstream>
@@ -197,7 +198,8 @@
     UpnpUnRegisterRootDevice(m->dvh);
 
     std::unique_lock<std::mutex> lock(o->devices_lock);
-    STD_UNORDERED_MAP<std::string, UpnpDevice *>::iterator it = o->devices.find(m->deviceId);
+    STD_UNORDERED_MAP<std::string, UpnpDevice *>::iterator it =
+        o->devices.find(m->deviceId);
     if (it != o->devices.end())
         o->devices.erase(it);
 }
@@ -318,7 +320,14 @@
             // Call the action routine
             int ret = callit->second(sc, dt);
             if (ret != UPNP_E_SUCCESS) {
-                LOGERR("UpnpDevice: Action failed: " << sc.getName() << endl);
+                if (ret > 0) {
+                    act->ErrCode = ret;
+                    strncpy(act->ErrStr, servit->second->errString(ret).c_str(),
+                            LINE_SIZE-1);
+                    act->ErrStr[LINE_SIZE-1] = 0;
+                }
+                LOGERR("UpnpDevice: Action failed: " << sc.getName() <<
+                       " code " << ret << endl);
                 return ret;
             }
         }
@@ -616,7 +625,7 @@
     }
 }
 
-bool UpnpService::noevents()
+bool UpnpService::noevents() const
 {
     return m && m->noevents;
 }
@@ -637,5 +646,31 @@
     return m_serviceId;
 }
 
+const std::string UpnpService::errString(int error) const
+{
+    switch (error) {
+    case UPNP_INVALID_ACTION: return "Invalid Action";
+    case UPNP_INVALID_ARGS: return "Invalid Args";
+    case UPNP_INVALID_VAR: return "Invalid Var";
+    case UPNP_ACTION_FAILED: return "Action Failed";
+    case UPNP_ARG_VALUE_INVALID: return "Arg Value Invalid";
+    case UPNP_ARG_VALUE_OUT_OF_RANGE: return "Arg Value Out Of Range";
+    case UPNP_OPTIONAL_ACTION_NOT_IMPLEMENTED:
+        return "Optional Action Not Implemented";
+    case UPNP_OUT_OF_MEMORY: return "Out Of MEMORY";
+    case UPNP_HUMAN_INTERVENTION_REQUIRED: return "Human Intervention Required";
+    case UPNP_STRING_ARGUMENT_TOO_LONG: return "String Argument Too Long";
+    case UPNP_ACTION_NOT_AUTHORIZED: return "Action Not Authorized";
+    case UPNP_SIGNATURE_FAILING: return "Signature Failing";
+    case UPNP_SIGNATURE_MISSING: return "Signature Missing";
+    case UPNP_NOT_ENCRYPTED: return "Not Encrypted";
+    case UPNP_INVALID_SEQUENCE: return "Invalid Sequence";
+    case UPNP_INVALID_CONTROL_URLS: return "Invalid Control URLS";
+    case UPNP_NO_SUCH_SESSION: return "No Such Session";
+    default:
+        break;
+    }
+    return serviceErrString(error);
+}
 
 }// End namespace UPnPProvider