1 #include "Offload.h"
2
3 #include <android-base/logging.h>
4
5 #include "chre_interface_factory.h"
6 #include "hidl_return_util.h"
7
8 namespace android {
9 namespace hardware {
10 namespace wifi {
11 namespace offload {
12 namespace V1_0 {
13 namespace implementation {
14
15 using hidl_return_util::validateAndCall;
16
Offload()17 Offload::Offload()
18 : mOffloadServer(new OffloadServer(new ChreInterfaceFactory())), cookie_(0),
19 death_handler_(new HidlDeathHandler<IOffloadCallback>(
20 std::bind(&Offload::onObjectDeath, this, std::placeholders::_1))) {
21 LOG(android::base::INFO) << "Wifi Offload HAL impl";
22 }
23
24 // Methods from ::android::hardware::wifi::offload::V1_0::IOffload follow.
configureScans(const ScanParam & param,const ScanFilter & filter,configureScans_cb _hidl_cb)25 Return<void> Offload::configureScans(const ScanParam ¶m, const ScanFilter &filter,
26 configureScans_cb _hidl_cb) {
27 return validateAndCall(this, &Offload::configureScansInternal, _hidl_cb, param, filter);
28 }
29
getScanStats(getScanStats_cb _hidl_cb)30 Return<void> Offload::getScanStats(getScanStats_cb _hidl_cb) {
31 return validateAndCall(this, &Offload::getScanStatsInternal, _hidl_cb);
32 }
33
subscribeScanResults(uint32_t delayMs,subscribeScanResults_cb _hidl_cb)34 Return<void> Offload::subscribeScanResults(uint32_t delayMs, subscribeScanResults_cb _hidl_cb) {
35 return validateAndCall(this, &Offload::subscribeScanResultsInternal, _hidl_cb, delayMs);
36 }
37
unsubscribeScanResults()38 Return<void> Offload::unsubscribeScanResults() {
39 if (!mOffloadServer->unsubscribeScanResults()) {
40 LOG(ERROR) << "Unable to unsubscribe";
41 }
42 return Void();
43 }
44
setEventCallback(const sp<IOffloadCallback> & cb)45 Return<void> Offload::setEventCallback(const sp<IOffloadCallback>& cb) {
46 if (!mOffloadServer->setEventCallback(cb)) {
47 LOG(ERROR) << "No callback set";
48 return Void();
49 }
50 cookie_ = reinterpret_cast<uint64_t>(cb.get());
51 death_handler_->setCallback(cb);
52 cb->linkToDeath(death_handler_, cookie_);
53 return Void();
54 }
55
configureScansInternal(const ScanParam & param,const ScanFilter & filter)56 OffloadStatus Offload::configureScansInternal(const ScanParam ¶m, const ScanFilter &filter) {
57 return mOffloadServer->configureScans(param, filter);
58 }
59
getScanStatsInternal()60 std::pair<OffloadStatus, ScanStats> Offload::getScanStatsInternal() {
61 return mOffloadServer->getScanStats();
62 }
63
subscribeScanResultsInternal(uint32_t delayMs)64 OffloadStatus Offload::subscribeScanResultsInternal(uint32_t delayMs) {
65 return mOffloadServer->subscribeScanResults(delayMs);
66 }
67
onObjectDeath(uint64_t cookie)68 void Offload::onObjectDeath(uint64_t cookie) {
69 if (cookie == cookie_) {
70 LOG(DEBUG) << "OffloadCallback death notification received";
71 mOffloadServer->clearEventCallback();
72 cookie_ = 0;
73 }
74 }
75 // Methods from ::android::hidl::base::V1_0::IBase follow.
76
77 } // namespace implementation
78 } // namespace V1_0
79 } // namespace offload
80 } // namespace wifi
81 } // namespace hardware
82 } // namespace android
83