Home | History | Annotate | Line # | Download | only in binder
      1 /*
      2  * binder interface for wpa_supplicant daemon
      3  * Copyright (c) 2004-2016, Jouni Malinen <j (at) w1.fi>
      4  * Copyright (c) 2004-2016, Roshan Pius <rpius (at) 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