diff options
| author | 2017-02-27 14:25:50 -0500 | |
|---|---|---|
| committer | 2017-02-27 14:25:50 -0500 | |
| commit | 5e334af369f2255707131b8dd0094f9c3d27d851 (patch) | |
| tree | 345e0a0704e98a55be2cbe956f4d78dacbda1b25 | |
| parent | Fix log entry in timer::signal (#2600) (diff) | |
| parent | IR: separate functions of each port to their own files (diff) | |
| download | yuzu-5e334af369f2255707131b8dd0094f9c3d27d851.tar.gz yuzu-5e334af369f2255707131b8dd0094f9c3d27d851.tar.xz yuzu-5e334af369f2255707131b8dd0094f9c3d27d851.zip | |
Merge pull request #2594 from wwylele/ir-separate
IR: separate functions of each port to their own files
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/service/ir/ir.cpp | 94 | ||||
| -rw-r--r-- | src/core/hle/service/ir/ir.h | 57 | ||||
| -rw-r--r-- | src/core/hle/service/ir/ir_rst.cpp | 37 | ||||
| -rw-r--r-- | src/core/hle/service/ir/ir_rst.h | 3 | ||||
| -rw-r--r-- | src/core/hle/service/ir/ir_user.cpp | 112 | ||||
| -rw-r--r-- | src/core/hle/service/ir/ir_user.h | 3 |
6 files changed, 159 insertions, 147 deletions
diff --git a/src/core/hle/service/ir/ir.cpp b/src/core/hle/service/ir/ir.cpp index 7f1731a50..7ac34a990 100644 --- a/src/core/hle/service/ir/ir.cpp +++ b/src/core/hle/service/ir/ir.cpp | |||
| @@ -2,9 +2,6 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "core/hle/kernel/event.h" | ||
| 6 | #include "core/hle/kernel/kernel.h" | ||
| 7 | #include "core/hle/kernel/shared_memory.h" | ||
| 8 | #include "core/hle/service/ir/ir.h" | 5 | #include "core/hle/service/ir/ir.h" |
| 9 | #include "core/hle/service/ir/ir_rst.h" | 6 | #include "core/hle/service/ir/ir_rst.h" |
| 10 | #include "core/hle/service/ir/ir_u.h" | 7 | #include "core/hle/service/ir/ir_u.h" |
| @@ -14,101 +11,18 @@ | |||
| 14 | namespace Service { | 11 | namespace Service { |
| 15 | namespace IR { | 12 | namespace IR { |
| 16 | 13 | ||
| 17 | static Kernel::SharedPtr<Kernel::Event> handle_event; | ||
| 18 | static Kernel::SharedPtr<Kernel::Event> conn_status_event; | ||
| 19 | static Kernel::SharedPtr<Kernel::SharedMemory> shared_memory; | ||
| 20 | static Kernel::SharedPtr<Kernel::SharedMemory> transfer_shared_memory; | ||
| 21 | |||
| 22 | void GetHandles(Service::Interface* self) { | ||
| 23 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 24 | |||
| 25 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 26 | cmd_buff[2] = 0x4000000; | ||
| 27 | cmd_buff[3] = Kernel::g_handle_table.Create(Service::IR::shared_memory).MoveFrom(); | ||
| 28 | cmd_buff[4] = Kernel::g_handle_table.Create(Service::IR::handle_event).MoveFrom(); | ||
| 29 | } | ||
| 30 | |||
| 31 | void InitializeIrNopShared(Interface* self) { | ||
| 32 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 33 | |||
| 34 | u32 transfer_buff_size = cmd_buff[1]; | ||
| 35 | u32 recv_buff_size = cmd_buff[2]; | ||
| 36 | u32 unk1 = cmd_buff[3]; | ||
| 37 | u32 send_buff_size = cmd_buff[4]; | ||
| 38 | u32 unk2 = cmd_buff[5]; | ||
| 39 | u8 baud_rate = cmd_buff[6] & 0xFF; | ||
| 40 | Kernel::Handle handle = cmd_buff[8]; | ||
| 41 | |||
| 42 | if (Kernel::g_handle_table.IsValid(handle)) { | ||
| 43 | transfer_shared_memory = Kernel::g_handle_table.Get<Kernel::SharedMemory>(handle); | ||
| 44 | transfer_shared_memory->name = "IR:TransferSharedMemory"; | ||
| 45 | } | ||
| 46 | |||
| 47 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 48 | |||
| 49 | LOG_WARNING(Service_IR, "(STUBBED) called, transfer_buff_size=%d, recv_buff_size=%d, " | ||
| 50 | "unk1=%d, send_buff_size=%d, unk2=%d, baud_rate=%u, handle=0x%08X", | ||
| 51 | transfer_buff_size, recv_buff_size, unk1, send_buff_size, unk2, baud_rate, handle); | ||
| 52 | } | ||
| 53 | |||
| 54 | void RequireConnection(Interface* self) { | ||
| 55 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 56 | |||
| 57 | conn_status_event->Signal(); | ||
| 58 | |||
| 59 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 60 | |||
| 61 | LOG_WARNING(Service_IR, "(STUBBED) called"); | ||
| 62 | } | ||
| 63 | |||
| 64 | void Disconnect(Interface* self) { | ||
| 65 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 66 | |||
| 67 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 68 | |||
| 69 | LOG_WARNING(Service_IR, "(STUBBED) called"); | ||
| 70 | } | ||
| 71 | |||
| 72 | void GetConnectionStatusEvent(Interface* self) { | ||
| 73 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 74 | |||
| 75 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 76 | cmd_buff[3] = Kernel::g_handle_table.Create(Service::IR::conn_status_event).MoveFrom(); | ||
| 77 | |||
| 78 | LOG_WARNING(Service_IR, "(STUBBED) called"); | ||
| 79 | } | ||
| 80 | |||
| 81 | void FinalizeIrNop(Interface* self) { | ||
| 82 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 83 | |||
| 84 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 85 | |||
| 86 | LOG_WARNING(Service_IR, "(STUBBED) called"); | ||
| 87 | } | ||
| 88 | |||
| 89 | void Init() { | 14 | void Init() { |
| 90 | using namespace Kernel; | ||
| 91 | |||
| 92 | AddService(new IR_RST_Interface); | 15 | AddService(new IR_RST_Interface); |
| 93 | AddService(new IR_U_Interface); | 16 | AddService(new IR_U_Interface); |
| 94 | AddService(new IR_User_Interface); | 17 | AddService(new IR_User_Interface); |
| 95 | 18 | ||
| 96 | using Kernel::MemoryPermission; | 19 | InitUser(); |
| 97 | shared_memory = SharedMemory::Create(nullptr, 0x1000, Kernel::MemoryPermission::ReadWrite, | 20 | InitRST(); |
| 98 | Kernel::MemoryPermission::ReadWrite, 0, | ||
| 99 | Kernel::MemoryRegion::BASE, "IR:SharedMemory"); | ||
| 100 | transfer_shared_memory = nullptr; | ||
| 101 | |||
| 102 | // Create event handle(s) | ||
| 103 | handle_event = Event::Create(ResetType::OneShot, "IR:HandleEvent"); | ||
| 104 | conn_status_event = Event::Create(ResetType::OneShot, "IR:ConnectionStatusEvent"); | ||
| 105 | } | 21 | } |
| 106 | 22 | ||
| 107 | void Shutdown() { | 23 | void Shutdown() { |
| 108 | transfer_shared_memory = nullptr; | 24 | ShutdownUser(); |
| 109 | shared_memory = nullptr; | 25 | ShutdownRST(); |
| 110 | handle_event = nullptr; | ||
| 111 | conn_status_event = nullptr; | ||
| 112 | } | 26 | } |
| 113 | 27 | ||
| 114 | } // namespace IR | 28 | } // namespace IR |
diff --git a/src/core/hle/service/ir/ir.h b/src/core/hle/service/ir/ir.h index 72d44ce60..c741498e2 100644 --- a/src/core/hle/service/ir/ir.h +++ b/src/core/hle/service/ir/ir.h | |||
| @@ -10,63 +10,6 @@ class Interface; | |||
| 10 | 10 | ||
| 11 | namespace IR { | 11 | namespace IR { |
| 12 | 12 | ||
| 13 | /** | ||
| 14 | * IR::GetHandles service function | ||
| 15 | * Outputs: | ||
| 16 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 17 | * 2 : Translate header, used by the ARM11-kernel | ||
| 18 | * 3 : Shared memory handle | ||
| 19 | * 4 : Event handle | ||
| 20 | */ | ||
| 21 | void GetHandles(Interface* self); | ||
| 22 | |||
| 23 | /** | ||
| 24 | * IR::InitializeIrNopShared service function | ||
| 25 | * Inputs: | ||
| 26 | * 1 : Size of transfer buffer | ||
| 27 | * 2 : Recv buffer size | ||
| 28 | * 3 : unknown | ||
| 29 | * 4 : Send buffer size | ||
| 30 | * 5 : unknown | ||
| 31 | * 6 : BaudRate (u8) | ||
| 32 | * 7 : 0 | ||
| 33 | * 8 : Handle of transfer shared memory | ||
| 34 | * Outputs: | ||
| 35 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 36 | */ | ||
| 37 | void InitializeIrNopShared(Interface* self); | ||
| 38 | |||
| 39 | /** | ||
| 40 | * IR::FinalizeIrNop service function | ||
| 41 | * Outputs: | ||
| 42 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 43 | */ | ||
| 44 | void FinalizeIrNop(Interface* self); | ||
| 45 | |||
| 46 | /** | ||
| 47 | * IR::GetConnectionStatusEvent service function | ||
| 48 | * Outputs: | ||
| 49 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 50 | * 2 : Connection Status Event handle | ||
| 51 | */ | ||
| 52 | void GetConnectionStatusEvent(Interface* self); | ||
| 53 | |||
| 54 | /** | ||
| 55 | * IR::Disconnect service function | ||
| 56 | * Outputs: | ||
| 57 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 58 | */ | ||
| 59 | void Disconnect(Interface* self); | ||
| 60 | |||
| 61 | /** | ||
| 62 | * IR::RequireConnection service function | ||
| 63 | * Inputs: | ||
| 64 | * 1 : unknown (u8), looks like always 1 | ||
| 65 | * Outputs: | ||
| 66 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 67 | */ | ||
| 68 | void RequireConnection(Interface* self); | ||
| 69 | |||
| 70 | /// Initialize IR service | 13 | /// Initialize IR service |
| 71 | void Init(); | 14 | void Init(); |
| 72 | 15 | ||
diff --git a/src/core/hle/service/ir/ir_rst.cpp b/src/core/hle/service/ir/ir_rst.cpp index 1f10ebd3d..3f1275c53 100644 --- a/src/core/hle/service/ir/ir_rst.cpp +++ b/src/core/hle/service/ir/ir_rst.cpp | |||
| @@ -2,12 +2,34 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "core/hle/kernel/event.h" | ||
| 6 | #include "core/hle/kernel/shared_memory.h" | ||
| 5 | #include "core/hle/service/ir/ir.h" | 7 | #include "core/hle/service/ir/ir.h" |
| 6 | #include "core/hle/service/ir/ir_rst.h" | 8 | #include "core/hle/service/ir/ir_rst.h" |
| 7 | 9 | ||
| 8 | namespace Service { | 10 | namespace Service { |
| 9 | namespace IR { | 11 | namespace IR { |
| 10 | 12 | ||
| 13 | static Kernel::SharedPtr<Kernel::Event> handle_event; | ||
| 14 | static Kernel::SharedPtr<Kernel::SharedMemory> shared_memory; | ||
| 15 | |||
| 16 | /** | ||
| 17 | * IR::GetHandles service function | ||
| 18 | * Outputs: | ||
| 19 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 20 | * 2 : Translate header, used by the ARM11-kernel | ||
| 21 | * 3 : Shared memory handle | ||
| 22 | * 4 : Event handle | ||
| 23 | */ | ||
| 24 | static void GetHandles(Interface* self) { | ||
| 25 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 26 | |||
| 27 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 28 | cmd_buff[2] = 0x4000000; | ||
| 29 | cmd_buff[3] = Kernel::g_handle_table.Create(Service::IR::shared_memory).MoveFrom(); | ||
| 30 | cmd_buff[4] = Kernel::g_handle_table.Create(Service::IR::handle_event).MoveFrom(); | ||
| 31 | } | ||
| 32 | |||
| 11 | const Interface::FunctionInfo FunctionTable[] = { | 33 | const Interface::FunctionInfo FunctionTable[] = { |
| 12 | {0x00010000, GetHandles, "GetHandles"}, | 34 | {0x00010000, GetHandles, "GetHandles"}, |
| 13 | {0x00020080, nullptr, "Initialize"}, | 35 | {0x00020080, nullptr, "Initialize"}, |
| @@ -19,5 +41,20 @@ IR_RST_Interface::IR_RST_Interface() { | |||
| 19 | Register(FunctionTable); | 41 | Register(FunctionTable); |
| 20 | } | 42 | } |
| 21 | 43 | ||
| 44 | void InitRST() { | ||
| 45 | using namespace Kernel; | ||
| 46 | |||
| 47 | shared_memory = | ||
| 48 | SharedMemory::Create(nullptr, 0x1000, MemoryPermission::ReadWrite, | ||
| 49 | MemoryPermission::ReadWrite, 0, MemoryRegion::BASE, "IR:SharedMemory"); | ||
| 50 | |||
| 51 | handle_event = Event::Create(ResetType::OneShot, "IR:HandleEvent"); | ||
| 52 | } | ||
| 53 | |||
| 54 | void ShutdownRST() { | ||
| 55 | shared_memory = nullptr; | ||
| 56 | handle_event = nullptr; | ||
| 57 | } | ||
| 58 | |||
| 22 | } // namespace IR | 59 | } // namespace IR |
| 23 | } // namespace Service | 60 | } // namespace Service |
diff --git a/src/core/hle/service/ir/ir_rst.h b/src/core/hle/service/ir/ir_rst.h index a492e15c9..75b732627 100644 --- a/src/core/hle/service/ir/ir_rst.h +++ b/src/core/hle/service/ir/ir_rst.h | |||
| @@ -18,5 +18,8 @@ public: | |||
| 18 | } | 18 | } |
| 19 | }; | 19 | }; |
| 20 | 20 | ||
| 21 | void InitRST(); | ||
| 22 | void ShutdownRST(); | ||
| 23 | |||
| 21 | } // namespace IR | 24 | } // namespace IR |
| 22 | } // namespace Service | 25 | } // namespace Service |
diff --git a/src/core/hle/service/ir/ir_user.cpp b/src/core/hle/service/ir/ir_user.cpp index 6cff1d544..b326d7fc7 100644 --- a/src/core/hle/service/ir/ir_user.cpp +++ b/src/core/hle/service/ir/ir_user.cpp | |||
| @@ -2,12 +2,112 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "core/hle/kernel/event.h" | ||
| 6 | #include "core/hle/kernel/shared_memory.h" | ||
| 5 | #include "core/hle/service/ir/ir.h" | 7 | #include "core/hle/service/ir/ir.h" |
| 6 | #include "core/hle/service/ir/ir_user.h" | 8 | #include "core/hle/service/ir/ir_user.h" |
| 7 | 9 | ||
| 8 | namespace Service { | 10 | namespace Service { |
| 9 | namespace IR { | 11 | namespace IR { |
| 10 | 12 | ||
| 13 | static Kernel::SharedPtr<Kernel::Event> conn_status_event; | ||
| 14 | static Kernel::SharedPtr<Kernel::SharedMemory> transfer_shared_memory; | ||
| 15 | |||
| 16 | /** | ||
| 17 | * IR::InitializeIrNopShared service function | ||
| 18 | * Inputs: | ||
| 19 | * 1 : Size of transfer buffer | ||
| 20 | * 2 : Recv buffer size | ||
| 21 | * 3 : unknown | ||
| 22 | * 4 : Send buffer size | ||
| 23 | * 5 : unknown | ||
| 24 | * 6 : BaudRate (u8) | ||
| 25 | * 7 : 0 | ||
| 26 | * 8 : Handle of transfer shared memory | ||
| 27 | * Outputs: | ||
| 28 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 29 | */ | ||
| 30 | static void InitializeIrNopShared(Interface* self) { | ||
| 31 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 32 | |||
| 33 | u32 transfer_buff_size = cmd_buff[1]; | ||
| 34 | u32 recv_buff_size = cmd_buff[2]; | ||
| 35 | u32 unk1 = cmd_buff[3]; | ||
| 36 | u32 send_buff_size = cmd_buff[4]; | ||
| 37 | u32 unk2 = cmd_buff[5]; | ||
| 38 | u8 baud_rate = cmd_buff[6] & 0xFF; | ||
| 39 | Kernel::Handle handle = cmd_buff[8]; | ||
| 40 | |||
| 41 | if (Kernel::g_handle_table.IsValid(handle)) { | ||
| 42 | transfer_shared_memory = Kernel::g_handle_table.Get<Kernel::SharedMemory>(handle); | ||
| 43 | transfer_shared_memory->name = "IR:TransferSharedMemory"; | ||
| 44 | } | ||
| 45 | |||
| 46 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 47 | |||
| 48 | LOG_WARNING(Service_IR, "(STUBBED) called, transfer_buff_size=%d, recv_buff_size=%d, " | ||
| 49 | "unk1=%d, send_buff_size=%d, unk2=%d, baud_rate=%u, handle=0x%08X", | ||
| 50 | transfer_buff_size, recv_buff_size, unk1, send_buff_size, unk2, baud_rate, handle); | ||
| 51 | } | ||
| 52 | |||
| 53 | /** | ||
| 54 | * IR::RequireConnection service function | ||
| 55 | * Inputs: | ||
| 56 | * 1 : unknown (u8), looks like always 1 | ||
| 57 | * Outputs: | ||
| 58 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 59 | */ | ||
| 60 | static void RequireConnection(Interface* self) { | ||
| 61 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 62 | |||
| 63 | conn_status_event->Signal(); | ||
| 64 | |||
| 65 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 66 | |||
| 67 | LOG_WARNING(Service_IR, "(STUBBED) called"); | ||
| 68 | } | ||
| 69 | |||
| 70 | /** | ||
| 71 | * IR::Disconnect service function | ||
| 72 | * Outputs: | ||
| 73 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 74 | */ | ||
| 75 | static void Disconnect(Interface* self) { | ||
| 76 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 77 | |||
| 78 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 79 | |||
| 80 | LOG_WARNING(Service_IR, "(STUBBED) called"); | ||
| 81 | } | ||
| 82 | |||
| 83 | /** | ||
| 84 | * IR::GetConnectionStatusEvent service function | ||
| 85 | * Outputs: | ||
| 86 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 87 | * 2 : Connection Status Event handle | ||
| 88 | */ | ||
| 89 | static void GetConnectionStatusEvent(Interface* self) { | ||
| 90 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 91 | |||
| 92 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 93 | cmd_buff[3] = Kernel::g_handle_table.Create(Service::IR::conn_status_event).MoveFrom(); | ||
| 94 | |||
| 95 | LOG_WARNING(Service_IR, "(STUBBED) called"); | ||
| 96 | } | ||
| 97 | |||
| 98 | /** | ||
| 99 | * IR::FinalizeIrNop service function | ||
| 100 | * Outputs: | ||
| 101 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 102 | */ | ||
| 103 | static void FinalizeIrNop(Interface* self) { | ||
| 104 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 105 | |||
| 106 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 107 | |||
| 108 | LOG_WARNING(Service_IR, "(STUBBED) called"); | ||
| 109 | } | ||
| 110 | |||
| 11 | const Interface::FunctionInfo FunctionTable[] = { | 111 | const Interface::FunctionInfo FunctionTable[] = { |
| 12 | {0x00010182, nullptr, "InitializeIrNop"}, | 112 | {0x00010182, nullptr, "InitializeIrNop"}, |
| 13 | {0x00020000, FinalizeIrNop, "FinalizeIrNop"}, | 113 | {0x00020000, FinalizeIrNop, "FinalizeIrNop"}, |
| @@ -41,5 +141,17 @@ IR_User_Interface::IR_User_Interface() { | |||
| 41 | Register(FunctionTable); | 141 | Register(FunctionTable); |
| 42 | } | 142 | } |
| 43 | 143 | ||
| 144 | void InitUser() { | ||
| 145 | using namespace Kernel; | ||
| 146 | |||
| 147 | transfer_shared_memory = nullptr; | ||
| 148 | conn_status_event = Event::Create(ResetType::OneShot, "IR:ConnectionStatusEvent"); | ||
| 149 | } | ||
| 150 | |||
| 151 | void ShutdownUser() { | ||
| 152 | transfer_shared_memory = nullptr; | ||
| 153 | conn_status_event = nullptr; | ||
| 154 | } | ||
| 155 | |||
| 44 | } // namespace IR | 156 | } // namespace IR |
| 45 | } // namespace Service | 157 | } // namespace Service |
diff --git a/src/core/hle/service/ir/ir_user.h b/src/core/hle/service/ir/ir_user.h index 71c932ffa..3849bd923 100644 --- a/src/core/hle/service/ir/ir_user.h +++ b/src/core/hle/service/ir/ir_user.h | |||
| @@ -18,5 +18,8 @@ public: | |||
| 18 | } | 18 | } |
| 19 | }; | 19 | }; |
| 20 | 20 | ||
| 21 | void InitUser(); | ||
| 22 | void ShutdownUser(); | ||
| 23 | |||
| 21 | } // namespace IR | 24 | } // namespace IR |
| 22 | } // namespace Service | 25 | } // namespace Service |