1 // Copyright 2016 The Android Open Source Project 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "libwebserv/binder_server.h" 16 17 #include <utils/String16.h> 18 19 #include "libwebserv/binder_constants.h" 20 21 #include <string> 22 #include <vector> 23 24 using android::String16; 25 using android::sp; 26 using android::IBinder; 27 using std::string; 28 using std::vector; 29 30 namespace libwebserv { 31 32 BinderServer::BinderServer(brillo::MessageLoop* message_loop, 33 const base::Closure& on_server_online, 34 const base::Closure& on_server_offline, 35 android::BinderWrapper* binder_wrapper) 36 : message_loop_{message_loop}, 37 on_server_online_{on_server_online}, 38 on_server_offline_{on_server_offline}, 39 binder_wrapper_{binder_wrapper} { 40 message_loop_->PostTask(FROM_HERE, 41 base::Bind(&BinderServer::TryConnecting, 42 weak_ptr_factory_.GetWeakPtr())); 43 } 44 45 void BinderServer::TryConnecting() { 46 ClearLocalState(); 47 android::sp<android::IBinder> binder = binder_wrapper_->GetService( 48 libwebserv::kWebserverBinderServiceName); 49 if (!binder.get()) { 50 LOG(INFO) << "Webservd has not registered with service manager."; 51 } else if (!BuildLocalState(binder)) { 52 ClearLocalState(); 53 } else { 54 // Got a binder, built up appropriate local state, our job is done. 55 return; 56 } 57 message_loop_->PostDelayedTask(FROM_HERE, 58 base::Bind(&BinderServer::TryConnecting, 59 weak_ptr_factory_.GetWeakPtr()), 60 base::TimeDelta::FromSeconds(1)); 61 } 62 63 64 void BinderServer::ClearLocalState() { 65 // Remove all references to remote protocol handlers from our local wrappers. 66 67 // TODO(wiley) Define this method 68 //for (auto& local_handler: local_protocol_handlers_) { 69 // local_handler.second->ResetRemoteProtocolHandlers(); 70 //} 71 72 remote_server_.clear(); 73 } 74 75 bool BinderServer::BuildLocalState(android::sp<android::IBinder> server) { 76 remote_server_ = android::interface_cast<RemoteServer>(server); 77 vector<sp<IBinder>> remote_raw_binders; 78 if (!remote_server_->GetProtocolHandlers(&remote_raw_binders).isOk()) { 79 // Possibly the server died, this is not necessarily an error. 80 LOG(INFO) << "Webservd failed to tell us about protocol handlers."; 81 return false; 82 } 83 84 // Tell the local wrappers about the remote handlers that exist now. 85 for (auto& raw_binder: remote_raw_binders) { 86 sp<RemoteProtocolHandler> remote_handler = 87 android::interface_cast<RemoteProtocolHandler>(raw_binder); 88 String16 name; 89 if (!remote_handler->GetName(&name).isOk()) { 90 LOG(INFO) << "Remote handler could not report its name."; 91 return false; 92 } 93 // TODO(wiley) Look for a BinderPHGroup by that name in local_handlers_ 94 // Create a new BinderPHGroup if necessary 95 // Add it to the map under |name| 96 // Update |it| appropriately 97 // Tell |it| about |remote_handler| 98 } 99 return true; 100 } 101 102 } // namespace libwebserv 103