• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (C) 2016 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef TRUNKS_TRUNKS_BINDER_SERVICE_H_
18 #define TRUNKS_TRUNKS_BINDER_SERVICE_H_
19 
20 #include <base/memory/weak_ptr.h>
21 #include <brillo/binder_watcher.h>
22 #include <brillo/daemons/daemon.h>
23 
24 #include "android/trunks/BnTrunks.h"
25 #include "trunks/command_transceiver.h"
26 
27 namespace trunks {
28 
29 // TrunksBinderService registers for and handles all incoming binder calls for
30 // the trunksd system daemon.
31 //
32 // Example Usage:
33 //
34 // TrunksBinderService service;
35 // service.set_transceiver(&my_transceiver);
36 // service.Run();
37 class TrunksBinderService : public brillo::Daemon {
38  public:
39   TrunksBinderService() = default;
40   ~TrunksBinderService() override = default;
41 
42   // The |transceiver| will be the target of all incoming TPM commands. This
43   // class does not take ownership of |transceiver|.
set_transceiver(CommandTransceiver * transceiver)44   void set_transceiver(CommandTransceiver* transceiver) {
45     transceiver_ = transceiver;
46   }
47 
48  protected:
49   int OnInit() override;
50 
51  private:
52   friend class BinderServiceInternal;
53   class BinderServiceInternal : public android::trunks::BnTrunks {
54    public:
55     BinderServiceInternal(TrunksBinderService* service);
56     ~BinderServiceInternal() override = default;
57 
58     // ITrunks interface.
59     android::binder::Status SendCommand(
60         const std::vector<uint8_t>& command,
61         const android::sp<android::trunks::ITrunksClient>& client) override;
62     android::binder::Status SendCommandAndWait(
63         const std::vector<uint8_t>& command,
64         std::vector<uint8_t>* response) override;
65 
66    private:
67     void OnResponse(const android::sp<android::trunks::ITrunksClient>& client,
68                     const std::string& response);
69 
GetWeakPtr()70     base::WeakPtr<BinderServiceInternal> GetWeakPtr() {
71       return weak_factory_.GetWeakPtr();
72     }
73 
74     TrunksBinderService* service_;
75 
76     // Declared last so weak pointers are invalidated first on destruction.
77     base::WeakPtrFactory<BinderServiceInternal> weak_factory_{this};
78   };
79 
80   CommandTransceiver* transceiver_ = nullptr;
81   brillo::BinderWatcher watcher_;
82   android::sp<BinderServiceInternal> binder_;
83 
84   DISALLOW_COPY_AND_ASSIGN(TrunksBinderService);
85 };
86 
87 }  // namespace trunks
88 
89 
90 #endif  // TRUNKS_TRUNKS_BINDER_SERVICE_H_
91