1 /* 2 * binder interface for wpa_supplicant daemon 3 * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi> 4 * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com> 5 * 6 * This software may be distributed under the terms of the BSD license. 7 * See README for more details. 8 */ 9 10 #include <binder/IServiceManager.h> 11 12 #include "binder_constants.h" 13 #include "binder_manager.h" 14 15 extern "C" { 16 #include "utils/common.h" 17 #include "utils/includes.h" 18 } 19 20 namespace wpa_supplicant_binder { 21 22 BinderManager *BinderManager::instance_ = NULL; 23 24 BinderManager *BinderManager::getInstance() 25 { 26 if (!instance_) 27 instance_ = new BinderManager(); 28 return instance_; 29 } 30 31 void BinderManager::destroyInstance() 32 { 33 if (instance_) 34 delete instance_; 35 instance_ = NULL; 36 } 37 38 int BinderManager::registerBinderService(struct wpa_global *global) 39 { 40 /* Create the main binder service object and register with 41 * system service manager. */ 42 supplicant_object_ = new Supplicant(global); 43 android::String16 service_name(binder_constants::kServiceName); 44 android::defaultServiceManager()->addService( 45 service_name, android::IInterface::asBinder(supplicant_object_)); 46 return 0; 47 } 48 49 int BinderManager::registerInterface(struct wpa_supplicant *wpa_s) 50 { 51 if (!wpa_s) 52 return 1; 53 54 /* Using the corresponding wpa_supplicant pointer as key to our 55 * object map. */ 56 const void *iface_key = wpa_s; 57 58 /* Return failure if we already have an object for that iface_key. */ 59 if (iface_object_map_.find(iface_key) != iface_object_map_.end()) 60 return 1; 61 62 iface_object_map_[iface_key] = new Iface(wpa_s); 63 if (!iface_object_map_[iface_key].get()) 64 return 1; 65 66 wpa_s->binder_object_key = iface_key; 67 68 return 0; 69 } 70 71 int BinderManager::unregisterInterface(struct wpa_supplicant *wpa_s) 72 { 73 if (!wpa_s || !wpa_s->binder_object_key) 74 return 1; 75 76 const void *iface_key = wpa_s; 77 if (iface_object_map_.find(iface_key) == iface_object_map_.end()) 78 return 1; 79 80 /* Delete the corresponding iface object from our map. */ 81 iface_object_map_.erase(iface_key); 82 wpa_s->binder_object_key = NULL; 83 return 0; 84 } 85 86 int BinderManager::getIfaceBinderObjectByKey( 87 const void *iface_object_key, 88 android::sp<fi::w1::wpa_supplicant::IIface> *iface_object) 89 { 90 if (!iface_object_key || !iface_object) 91 return 1; 92 93 if (iface_object_map_.find(iface_object_key) == iface_object_map_.end()) 94 return 1; 95 96 *iface_object = iface_object_map_[iface_object_key]; 97 return 0; 98 } 99 100 } /* namespace wpa_supplicant_binder */ 101