Add handler for Deactivate payload command.

Change-Id: I6d01757b7b526ad15b1c059506603b5921e30473
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/command/payload_cmds.cpp b/command/payload_cmds.cpp
index 02c854a..31ab3a7 100644
--- a/command/payload_cmds.cpp
+++ b/command/payload_cmds.cpp
@@ -81,6 +81,67 @@
     return outPayload;
 }
 
+std::vector<uint8_t> deactivatePayload(std::vector<uint8_t>& inPayload,
+                                       const message::Handler& handler)
+{
+    std::vector<uint8_t> outPayload(sizeof(DeactivatePayloadResponse));
+    auto request = reinterpret_cast<DeactivatePayloadRequest*>
+            (inPayload.data());
+    auto response = reinterpret_cast<DeactivatePayloadResponse*>
+            (outPayload.data());
+
+    response->completionCode = IPMI_CC_OK;
+
+    // SOL is the payload currently supported for deactivation
+    if (static_cast<uint8_t>(message::PayloadType::SOL) != request->payloadType)
+    {
+        response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
+        return outPayload;
+    }
+
+    // Only one instance of SOL is supported
+    if (request->payloadInstance != 1)
+    {
+        response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
+        return outPayload;
+    }
+
+    auto status = std::get<sol::Manager&>(singletonPool).isPayloadActive(
+            request->payloadInstance);
+    if (!status)
+    {
+        response->completionCode = IPMI_CC_PAYLOAD_DEACTIVATED;
+        return outPayload;
+    }
+
+    try
+    {
+        auto& context = std::get<sol::Manager&>(singletonPool).getContext
+                (request->payloadInstance);
+        auto sessionID = context.sessionID;
+
+        activating(request->payloadInstance, sessionID);
+        std::get<sol::Manager&>(singletonPool).stopPayloadInstance(
+                request->payloadInstance);
+
+        auto check = std::get<session::Manager&>(singletonPool).stopSession
+                (sessionID);
+        if(!check)
+        {
+            response->completionCode = IPMI_CC_UNSPECIFIED_ERROR;
+        }
+    }
+    catch (std::exception& e)
+    {
+        log<level::ERR>(e.what());
+        response->completionCode = IPMI_CC_UNSPECIFIED_ERROR;
+        return outPayload;
+    }
+
+    return outPayload;
+}
+
 } // namespace command
 
 } // namespace sol
+