| /* |
| * binder interface for wpa_supplicant daemon |
| * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi> |
| * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com> |
| * |
| * This software may be distributed under the terms of the BSD license. |
| * See README for more details. |
| */ |
| |
| #include <binder/IServiceManager.h> |
| |
| #include "binder_manager.h" |
| |
| extern "C" { |
| #include "utils/includes.h" |
| #include "utils/common.h" |
| } |
| |
| namespace wpa_supplicant_binder { |
| |
| const char BinderManager::kBinderServiceName[] = "fi.w1.wpa_supplicant"; |
| BinderManager *BinderManager::instance_ = NULL; |
| |
| |
| BinderManager * BinderManager::getInstance() |
| { |
| if (!instance_) |
| instance_ = new BinderManager(); |
| return instance_; |
| } |
| |
| |
| void BinderManager::destroyInstance() |
| { |
| if (instance_) |
| delete instance_; |
| instance_ = NULL; |
| } |
| |
| |
| int BinderManager::registerBinderService(struct wpa_global *global) |
| { |
| /* Create the main binder service object and register with |
| * system service manager. */ |
| supplicant_object_ = new Supplicant(global); |
| android::String16 service_name(kBinderServiceName); |
| android::defaultServiceManager()->addService( |
| service_name, |
| android::IInterface::asBinder(supplicant_object_)); |
| return 0; |
| } |
| |
| |
| int BinderManager::registerInterface(struct wpa_supplicant *wpa_s) |
| { |
| if (!wpa_s) |
| return 1; |
| |
| /* Using the corresponding wpa_supplicant pointer as key to our |
| * object map. */ |
| const void *iface_key = wpa_s; |
| |
| /* Return failure if we already have an object for that iface_key. */ |
| if (iface_object_map_.find(iface_key) != iface_object_map_.end()) |
| return 1; |
| |
| iface_object_map_[iface_key] = new Iface(wpa_s); |
| if (!iface_object_map_[iface_key].get()) |
| return 1; |
| |
| wpa_s->binder_object_key = iface_key; |
| |
| return 0; |
| } |
| |
| |
| int BinderManager::unregisterInterface(struct wpa_supplicant *wpa_s) |
| { |
| if (!wpa_s || !wpa_s->binder_object_key) |
| return 1; |
| |
| const void *iface_key = wpa_s; |
| if (iface_object_map_.find(iface_key) == iface_object_map_.end()) |
| return 1; |
| |
| /* Delete the corresponding iface object from our map. */ |
| iface_object_map_.erase(iface_key); |
| wpa_s->binder_object_key = NULL; |
| return 0; |
| } |
| |
| |
| int BinderManager::getIfaceBinderObjectByKey( |
| const void *iface_object_key, |
| android::sp<fi::w1::wpa_supplicant::IIface> *iface_object) |
| { |
| if (!iface_object_key || !iface_object) |
| return 1; |
| |
| if (iface_object_map_.find(iface_object_key) == iface_object_map_.end()) |
| return 1; |
| |
| *iface_object = iface_object_map_[iface_object_key]; |
| return 0; |
| } |
| |
| } /* namespace wpa_supplicant_binder */ |