Home | History | Annotate | Download | only in libwebserv
      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