187bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor/* 287bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * Copyright (C) 2013 The Android Open Source Project 387bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * 487bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * Licensed under the Apache License, Version 2.0 (the "License"); 587bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * you may not use this file except in compliance with the License. 687bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * You may obtain a copy of the License at 787bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * 887bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * http://www.apache.org/licenses/LICENSE-2.0 987bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * 1087bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * Unless required by applicable law or agreed to in writing, software 1187bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * distributed under the License is distributed on an "AS IS" BASIS, 1287bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1387bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * See the License for the specific language governing permissions and 1487bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor * limitations under the License. 1587bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor */ 1687bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 1787bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor#define LOG_TAG "IBatteryPropertiesRegistrar" 1887bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor//#define LOG_NDEBUG 0 1987bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor#include <utils/Log.h> 2087bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 2187bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor#include <batteryservice/IBatteryPropertiesListener.h> 2287bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor#include <batteryservice/IBatteryPropertiesRegistrar.h> 2387bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor#include <stdint.h> 2487bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor#include <sys/types.h> 2587bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor#include <binder/Parcel.h> 2687bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 2787bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynornamespace android { 2887bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 2987bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynorclass BpBatteryPropertiesRegistrar : public BpInterface<IBatteryPropertiesRegistrar> { 3087bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynorpublic: 3187bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor BpBatteryPropertiesRegistrar(const sp<IBinder>& impl) 3287bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor : BpInterface<IBatteryPropertiesRegistrar>(impl) {} 3387bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 3487bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor void registerListener(const sp<IBatteryPropertiesListener>& listener) { 3587bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor Parcel data; 3687bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor data.writeInterfaceToken(IBatteryPropertiesRegistrar::getInterfaceDescriptor()); 3787bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor data.writeStrongBinder(listener->asBinder()); 3887bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor remote()->transact(REGISTER_LISTENER, data, NULL); 3987bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor } 4087bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 4187bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor void unregisterListener(const sp<IBatteryPropertiesListener>& listener) { 4287bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor Parcel data; 4387bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor data.writeInterfaceToken(IBatteryPropertiesRegistrar::getInterfaceDescriptor()); 4487bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor data.writeStrongBinder(listener->asBinder()); 4587bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor remote()->transact(UNREGISTER_LISTENER, data, NULL); 4687bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor } 47cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor 48cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor status_t getProperty(int id, struct BatteryProperty *val) { 49cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor Parcel data, reply; 50cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor data.writeInterfaceToken(IBatteryPropertiesRegistrar::getInterfaceDescriptor()); 51cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor data.writeInt32(id); 52cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor remote()->transact(GET_PROPERTY, data, &reply); 530a32461524f55697cdc49baa5c26c95839f4b52aPaul Lawrence int32_t ret = reply.readExceptionCode(); 540a32461524f55697cdc49baa5c26c95839f4b52aPaul Lawrence if (ret != 0) { 550a32461524f55697cdc49baa5c26c95839f4b52aPaul Lawrence return ret; 560a32461524f55697cdc49baa5c26c95839f4b52aPaul Lawrence } 570a32461524f55697cdc49baa5c26c95839f4b52aPaul Lawrence ret = reply.readInt32(); 58cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor int parcelpresent = reply.readInt32(); 59cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor if (parcelpresent) 60cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor val->readFromParcel(&reply); 61cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor return ret; 62cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor } 6387bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor}; 6487bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 6587bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd PoynorIMPLEMENT_META_INTERFACE(BatteryPropertiesRegistrar, "android.os.IBatteryPropertiesRegistrar"); 6687bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 6787bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynorstatus_t BnBatteryPropertiesRegistrar::onTransact(uint32_t code, 6887bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor const Parcel& data, 6987bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor Parcel* reply, 7087bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor uint32_t flags) 7187bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor{ 7287bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor switch(code) { 7387bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor case REGISTER_LISTENER: { 7487bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor CHECK_INTERFACE(IBatteryPropertiesRegistrar, data, reply); 7587bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor sp<IBatteryPropertiesListener> listener = 7687bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor interface_cast<IBatteryPropertiesListener>(data.readStrongBinder()); 7787bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor registerListener(listener); 7887bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor return OK; 7987bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor } 8087bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 8187bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor case UNREGISTER_LISTENER: { 8287bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor CHECK_INTERFACE(IBatteryPropertiesRegistrar, data, reply); 8387bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor sp<IBatteryPropertiesListener> listener = 8487bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor interface_cast<IBatteryPropertiesListener>(data.readStrongBinder()); 8587bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor unregisterListener(listener); 8687bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor return OK; 8787bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor } 88cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor 89cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor case GET_PROPERTY: { 90cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor CHECK_INTERFACE(IBatteryPropertiesRegistrar, data, reply); 91cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor int id = data.readInt32(); 92cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor struct BatteryProperty val; 93cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor status_t result = getProperty(id, &val); 94cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor reply->writeNoException(); 95cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor reply->writeInt32(result); 96cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor reply->writeInt32(1); 97cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor val.writeToParcel(reply); 98cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor return OK; 99cf8087358658d393150c383b01feef9064a4cdfcTodd Poynor } 10087bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor } 10187bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor return BBinder::onTransact(code, data, reply, flags); 10287bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor}; 10387bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 10487bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor// ---------------------------------------------------------------------------- 10587bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor 10687bf0d97be5ef2689546b246dfb6c21c4eec3ce0Todd Poynor}; // namespace android 107