1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <stdint.h>
6
7 #include <map>
8 #include <utility>
9
10 #include "base/macros.h"
11 #include "mojo/public/cpp/bindings/strong_binding.h"
12 #include "mojo/public/interfaces/bindings/tests/versioning_test_service.mojom.h"
13 #include "services/service_manager/public/c/main.h"
14 #include "services/service_manager/public/cpp/binder_registry.h"
15 #include "services/service_manager/public/cpp/service.h"
16 #include "services/service_manager/public/cpp/service_runner.h"
17
18 namespace mojo {
19 namespace test {
20 namespace versioning {
21
22 struct EmployeeInfo {
23 public:
EmployeeInfomojo::test::versioning::EmployeeInfo24 EmployeeInfo() {}
25
26 EmployeePtr employee;
27 Array<uint8_t> finger_print;
28
29 private:
30 DISALLOW_COPY_AND_ASSIGN(EmployeeInfo);
31 };
32
33 class HumanResourceDatabaseImpl : public HumanResourceDatabase {
34 public:
HumanResourceDatabaseImpl(InterfaceRequest<HumanResourceDatabase> request)35 explicit HumanResourceDatabaseImpl(
36 InterfaceRequest<HumanResourceDatabase> request)
37 : strong_binding_(this, std::move(request)) {
38 // Pretend that there is already some data in the system.
39 EmployeeInfo* info = new EmployeeInfo();
40 employees_[1] = info;
41 info->employee = Employee::New();
42 info->employee->employee_id = 1;
43 info->employee->name = "Homer Simpson";
44 info->employee->department = DEPARTMENT_DEV;
45 info->employee->birthday = Date::New();
46 info->employee->birthday->year = 1955;
47 info->employee->birthday->month = 5;
48 info->employee->birthday->day = 12;
49 info->finger_print.resize(1024);
50 for (uint32_t i = 0; i < 1024; ++i)
51 info->finger_print[i] = i;
52 }
53
~HumanResourceDatabaseImpl()54 ~HumanResourceDatabaseImpl() override {
55 for (auto iter = employees_.begin(); iter != employees_.end(); ++iter)
56 delete iter->second;
57 }
58
AddEmployee(EmployeePtr employee,const AddEmployeeCallback & callback)59 void AddEmployee(EmployeePtr employee,
60 const AddEmployeeCallback& callback) override {
61 uint64_t id = employee->employee_id;
62 if (employees_.find(id) == employees_.end())
63 employees_[id] = new EmployeeInfo();
64 employees_[id]->employee = std::move(employee);
65 callback.Run(true);
66 }
67
QueryEmployee(uint64_t id,bool retrieve_finger_print,const QueryEmployeeCallback & callback)68 void QueryEmployee(uint64_t id,
69 bool retrieve_finger_print,
70 const QueryEmployeeCallback& callback) override {
71 if (employees_.find(id) == employees_.end()) {
72 callback.Run(nullptr, Array<uint8_t>());
73 return;
74 }
75 callback.Run(employees_[id]->employee.Clone(),
76 retrieve_finger_print ? employees_[id]->finger_print.Clone()
77 : Array<uint8_t>());
78 }
79
AttachFingerPrint(uint64_t id,Array<uint8_t> finger_print,const AttachFingerPrintCallback & callback)80 void AttachFingerPrint(uint64_t id,
81 Array<uint8_t> finger_print,
82 const AttachFingerPrintCallback& callback) override {
83 if (employees_.find(id) == employees_.end()) {
84 callback.Run(false);
85 return;
86 }
87 employees_[id]->finger_print = std::move(finger_print);
88 callback.Run(true);
89 }
90
91 private:
92 std::map<uint64_t, EmployeeInfo*> employees_;
93
94 StrongBinding<HumanResourceDatabase> strong_binding_;
95 };
96
97 class HumanResourceSystemServer : public service_manager::Service {
98 public:
HumanResourceSystemServer()99 HumanResourceSystemServer() {
100 registry_.AddInterface<HumanResourceDatabase>(
101 base::Bind(&HumanResourceSystemServer::Create, base::Unretained(this)));
102 }
103
104 // service_manager::Service implementation.
OnBindInterface(const service_manager::BindSourceInfo & source_info,const std::string & interface_name,mojo::ScopedMessagePipeHandle interface_pipe)105 void OnBindInterface(const service_manager::BindSourceInfo& source_info,
106 const std::string& interface_name,
107 mojo::ScopedMessagePipeHandle interface_pipe) override {
108 registry_.BindInterface(interface_name, std::move(interface_pipe));
109 }
110
Create(HumanResourceDatabaseRequest request)111 void Create(HumanResourceDatabaseRequest request) {
112 // It will be deleted automatically when the underlying pipe encounters a
113 // connection error.
114 new HumanResourceDatabaseImpl(std::move(request));
115 }
116
117 private:
118 service_manager::BinderRegistry registry_;
119 };
120
121 } // namespace versioning
122 } // namespace test
123 } // namespace mojo
124
ServiceMain(MojoHandle request)125 MojoResult ServiceMain(MojoHandle request) {
126 mojo::ServiceRunner runner(
127 new mojo::test::versioning::HumanResourceSystemServer());
128
129 return runner.Run(request);
130 }
131