From 7458e71f2463d86e1dd2b2a2b91f1b8b4c2f67b1 Mon Sep 17 00:00:00 2001
From: Lioncash <mathew1800@gmail.com>
Date: Wed, 25 Jul 2018 19:15:31 -0400
Subject: [PATCH] service: Add eupld services

Adds the skeleton for the eupld services based off information on Switch
Brew.
---
 src/core/CMakeLists.txt              |  2 ++
 src/core/hle/service/eupld/eupld.cpp | 52 ++++++++++++++++++++++++++++
 src/core/hle/service/eupld/eupld.h   | 16 +++++++++
 src/core/hle/service/service.cpp     |  2 ++
 4 files changed, 72 insertions(+)
 create mode 100644 src/core/hle/service/eupld/eupld.cpp
 create mode 100644 src/core/hle/service/eupld/eupld.h

diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 755a8a7eed..856abc97ee 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -140,6 +140,8 @@ add_library(core STATIC
     hle/service/erpt/erpt.h
     hle/service/es/es.cpp
     hle/service/es/es.h
+    hle/service/eupld/eupld.cpp
+    hle/service/eupld/eupld.h
     hle/service/fatal/fatal.cpp
     hle/service/fatal/fatal.h
     hle/service/fatal/fatal_p.cpp
diff --git a/src/core/hle/service/eupld/eupld.cpp b/src/core/hle/service/eupld/eupld.cpp
new file mode 100644
index 0000000000..2df30acee3
--- /dev/null
+++ b/src/core/hle/service/eupld/eupld.cpp
@@ -0,0 +1,52 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <memory>
+
+#include "core/hle/service/eupld/eupld.h"
+#include "core/hle/service/service.h"
+#include "core/hle/service/sm/sm.h"
+
+namespace Service::EUPLD {
+
+class ErrorUploadContext final : public ServiceFramework<ErrorUploadContext> {
+public:
+    explicit ErrorUploadContext() : ServiceFramework{"eupld:c"} {
+        // clang-format off
+        static const FunctionInfo functions[] = {
+            {0, nullptr, "SetUrl"},
+            {1, nullptr, "ImportCrt"},
+            {2, nullptr, "ImportPki"},
+            {3, nullptr, "SetAutoUpload"},
+        };
+        // clang-format on
+
+        RegisterHandlers(functions);
+    }
+};
+
+class ErrorUploadRequest final : public ServiceFramework<ErrorUploadRequest> {
+public:
+    explicit ErrorUploadRequest() : ServiceFramework{"eupld:r"} {
+        // clang-format off
+        static const FunctionInfo functions[] = {
+            {0, nullptr, "Initialize"},
+            {1, nullptr, "UploadAll"},
+            {2, nullptr, "UploadSelected"},
+            {3, nullptr, "GetUploadStatus"},
+            {4, nullptr, "CancelUpload"},
+            {5, nullptr, "GetResult"},
+        };
+        // clang-format on
+
+        RegisterHandlers(functions);
+    }
+};
+
+void InstallInterfaces(SM::ServiceManager& sm) {
+    std::make_shared<ErrorUploadContext>()->InstallAsService(sm);
+    std::make_shared<ErrorUploadRequest>()->InstallAsService(sm);
+}
+
+} // namespace Service::EUPLD
diff --git a/src/core/hle/service/eupld/eupld.h b/src/core/hle/service/eupld/eupld.h
new file mode 100644
index 0000000000..6eef2c15fc
--- /dev/null
+++ b/src/core/hle/service/eupld/eupld.h
@@ -0,0 +1,16 @@
+// Copyright 2018 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+namespace Service::SM {
+class ServiceManager;
+}
+
+namespace Service::EUPLD {
+
+/// Registers all EUPLD services with the specified service manager.
+void InstallInterfaces(SM::ServiceManager& sm);
+
+} // namespace Service::EUPLD
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index 1f17ee7c84..84340a40b5 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -23,6 +23,7 @@
 #include "core/hle/service/bcat/bcat.h"
 #include "core/hle/service/erpt/erpt.h"
 #include "core/hle/service/es/es.h"
+#include "core/hle/service/eupld/eupld.h"
 #include "core/hle/service/fatal/fatal.h"
 #include "core/hle/service/filesystem/filesystem.h"
 #include "core/hle/service/friend/friend.h"
@@ -191,6 +192,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm) {
     Audio::InstallInterfaces(*sm);
     ERPT::InstallInterfaces(*sm);
     ES::InstallInterfaces(*sm);
+    EUPLD::InstallInterfaces(*sm);
     Fatal::InstallInterfaces(*sm);
     FileSystem::InstallInterfaces(*sm);
     Friend::InstallInterfaces(*sm);