Add overriding methods for the base interface definition

Defines the functions that override the default setter for
the led state property.

Change-Id: Ic3a8d43cc783003c43f53df8f7e90d7fc4d6715a
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/controller.cpp b/controller.cpp
index bfc1c74..656c9bf 100644
--- a/controller.cpp
+++ b/controller.cpp
@@ -15,7 +15,10 @@
  */
 
 #include <iostream>
+#include <string>
 #include "argument.hpp"
+#include "physical.hpp"
+#include "config.h"
 
 static void ExitWithError(const char* err, char** argv)
 {
@@ -30,19 +33,46 @@
     // Read arguments.
     auto options = phosphor::led::ArgumentParser(argc, argv);
 
-    // Parse out Name argument.
-    auto name = std::move((options)["name"]);
-    if (name == phosphor::led::ArgumentParser::empty_string)
-    {
-        ExitWithError("Name not specified.", argv);
-    }
-
-    // Parse out Name argument.
+    // Parse out Path argument.
     auto path = std::move((options)["path"]);
     if (path == phosphor::led::ArgumentParser::empty_string)
     {
         ExitWithError("Path not specified.", argv);
     }
 
+    // Extract the name of LED from path.
+    auto index = path.rfind("/");
+    if (index == std::string::npos)
+    {
+        throw std::runtime_error("No Led in " + path);
+    }
+
+    // Remove the leading "/"
+    auto name = path.substr(index + 1);
+
+    // Unique bus name representing a single LED.
+    auto busName =  std::string(BUSNAME) + '.' + name;
+    auto objPath =  std::string(OBJPATH) + '/' + name;
+
+    // Get a handle to system dbus.
+    auto bus = std::move(sdbusplus::bus::new_default());
+
+    // Add systemd object manager.
+    sdbusplus::server::manager::manager(bus, objPath.c_str());
+
+    // Create the Physical LED objects for directing actions.
+    // Need to save this else sdbusplus destructor will wipe this off.
+    auto obj = phosphor::led::Physical(bus, objPath, path);
+
+    /** @brief Claim the bus */
+    bus.request_name(busName.c_str());
+
+    /** @brief Wait for client requests */
+    while(true)
+    {
+        // Handle dbus message / signals discarding unhandled
+        bus.process_discard();
+        bus.wait();
+    }
     return 0;
 }