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