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