1951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen/* 2951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * Copyright (C) 2012 The Android Open Source Project 3951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * 4951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * you may not use this file except in compliance with the License. 6951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * You may obtain a copy of the License at 7951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * 8951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * http://www.apache.org/licenses/LICENSE-2.0 9951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * 10951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * Unless required by applicable law or agreed to in writing, software 11951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * distributed under the License is distributed on an "AS IS" BASIS, 12951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * See the License for the specific language governing permissions and 14951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * limitations under the License. 15951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen */ 16e5167f88f3734a048dc44199f3fff0432589db43Elliott Hughes 17e5167f88f3734a048dc44199f3fff0432589db43Elliott Hughes#include <sys/socket.h> 18951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 19951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <common_time/ICommonClock.h> 20951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <binder/Parcel.h> 21951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 22951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include "utils.h" 23951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 24951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chennamespace android { 25951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 26951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen/***** ICommonClock *****/ 27951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 28951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenenum { 29951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen IS_COMMON_TIME_VALID = IBinder::FIRST_CALL_TRANSACTION, 30951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen COMMON_TIME_TO_LOCAL_TIME, 31951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen LOCAL_TIME_TO_COMMON_TIME, 32951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen GET_COMMON_TIME, 33951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen GET_COMMON_FREQ, 34951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen GET_LOCAL_TIME, 35951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen GET_LOCAL_FREQ, 36951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen GET_ESTIMATED_ERROR, 37951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen GET_TIMELINE_ID, 38951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen GET_STATE, 39951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen GET_MASTER_ADDRESS, 40951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen REGISTER_LISTENER, 41951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen UNREGISTER_LISTENER, 42951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}; 43951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 44951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenconst String16 ICommonClock::kServiceName("common_time.clock"); 45951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenconst uint64_t ICommonClock::kInvalidTimelineID = 0; 46951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenconst int32_t ICommonClock::kErrorEstimateUnknown = 0x7FFFFFFF; 47951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 48951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenclass BpCommonClock : public BpInterface<ICommonClock> 49951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen{ 50951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen public: 51951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen BpCommonClock(const sp<IBinder>& impl) 52951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen : BpInterface<ICommonClock>(impl) {} 53951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 54951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t isCommonTimeValid(bool* valid, uint32_t* timelineID) { 55951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 56951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 57951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(IS_COMMON_TIME_VALID, 58951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data, 59951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen &reply); 60951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 61951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 62951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 63951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *valid = reply.readInt32(); 64951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *timelineID = reply.readInt32(); 65951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 66951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 67951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 68951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 69951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 70951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t commonTimeToLocalTime(int64_t commonTime, 71951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int64_t* localTime) { 72951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 73951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 74951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInt64(commonTime); 75951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(COMMON_TIME_TO_LOCAL_TIME, 76951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data, &reply); 77951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 78951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 79951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 80951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *localTime = reply.readInt64(); 81951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 82951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 83951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 84951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 85951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 86951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t localTimeToCommonTime(int64_t localTime, 87951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int64_t* commonTime) { 88951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 89951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 90951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInt64(localTime); 91951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(LOCAL_TIME_TO_COMMON_TIME, 92951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data, &reply); 93951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 94951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 95951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 96951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *commonTime = reply.readInt64(); 97951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 98951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 99951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 100951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 101951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 102951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t getCommonTime(int64_t* commonTime) { 103951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 104951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 105951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(GET_COMMON_TIME, data, &reply); 106951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 107951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 108951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 109951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *commonTime = reply.readInt64(); 110951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 111951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 112951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 113951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 114951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 115951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t getCommonFreq(uint64_t* freq) { 116951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 117951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 118951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(GET_COMMON_FREQ, data, &reply); 119951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 120951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 121951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 122951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *freq = reply.readInt64(); 123951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 124951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 125951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 126951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 127951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 128951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t getLocalTime(int64_t* localTime) { 129951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 130951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 131951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(GET_LOCAL_TIME, data, &reply); 132951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 133951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 134951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 135951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *localTime = reply.readInt64(); 136951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 137951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 138951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 139951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 140951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 141951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t getLocalFreq(uint64_t* freq) { 142951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 143951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 144951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(GET_LOCAL_FREQ, data, &reply); 145951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 146951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 147951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 148951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *freq = reply.readInt64(); 149951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 150951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 151951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 152951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 153951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 154951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t getEstimatedError(int32_t* estimate) { 155951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 156951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 157951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(GET_ESTIMATED_ERROR, data, &reply); 158951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 159951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 160951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 161951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *estimate = reply.readInt32(); 162951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 163951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 164951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 165951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 166951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 167951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t getTimelineID(uint64_t* id) { 168951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 169951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 170951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(GET_TIMELINE_ID, data, &reply); 171951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 172951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 173951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 174951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *id = static_cast<uint64_t>(reply.readInt64()); 175951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 176951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 177951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 178951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 179951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 180951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t getState(State* state) { 181951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 182951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 183951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(GET_STATE, data, &reply); 184951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 185951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 186951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 187951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *state = static_cast<State>(reply.readInt32()); 188951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 189951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 190951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 191951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 192951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 193951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t getMasterAddr(struct sockaddr_storage* addr) { 194951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 195951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 196951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(GET_MASTER_ADDRESS, data, &reply); 197951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 198951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 199951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) 200951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen deserializeSockaddr(&reply, addr); 201951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 202951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 203951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 204951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 205951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t registerListener( 206951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen const sp<ICommonClockListener>& listener) { 207951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 208951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 209951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeStrongBinder(listener->asBinder()); 210951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 211951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(REGISTER_LISTENER, data, &reply); 212951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 213951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 214951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 215951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 216951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 217951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 218951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 219951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 220951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual status_t unregisterListener( 221951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen const sp<ICommonClockListener>& listener) { 222951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 223951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); 224951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeStrongBinder(listener->asBinder()); 225951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = remote()->transact(UNREGISTER_LISTENER, data, &reply); 226951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 227951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 228951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = reply.readInt32(); 229951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 230951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 231951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return status; 232951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 233951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}; 234951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 235951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. ChenIMPLEMENT_META_INTERFACE(CommonClock, "android.os.ICommonClock"); 236951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 237951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenstatus_t BnCommonClock::onTransact(uint32_t code, 238951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen const Parcel& data, 239951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel* reply, 240951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen uint32_t flags) { 241951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen switch(code) { 242951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case IS_COMMON_TIME_VALID: { 243951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 244951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen bool valid; 245951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen uint32_t timelineID; 246951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = isCommonTimeValid(&valid, &timelineID); 247951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 248951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 249951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(valid); 250951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(timelineID); 251951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 252951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 253951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 254951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 255951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case COMMON_TIME_TO_LOCAL_TIME: { 256951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 257951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int64_t commonTime = data.readInt64(); 258951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int64_t localTime; 259951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = commonTimeToLocalTime(commonTime, &localTime); 260951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 261951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 262951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt64(localTime); 263951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 264951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 265951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 266951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 267951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case LOCAL_TIME_TO_COMMON_TIME: { 268951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 269951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int64_t localTime = data.readInt64(); 270951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int64_t commonTime; 271951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = localTimeToCommonTime(localTime, &commonTime); 272951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 273951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 274951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt64(commonTime); 275951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 276951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 277951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 278951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 279951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case GET_COMMON_TIME: { 280951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 281951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int64_t commonTime; 282951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = getCommonTime(&commonTime); 283951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 284951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 285951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt64(commonTime); 286951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 287951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 288951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 289951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 290951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case GET_COMMON_FREQ: { 291951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 292951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen uint64_t freq; 293951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = getCommonFreq(&freq); 294951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 295951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 296951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt64(freq); 297951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 298951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 299951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 300951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 301951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case GET_LOCAL_TIME: { 302951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 303951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int64_t localTime; 304951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = getLocalTime(&localTime); 305951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 306951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 307951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt64(localTime); 308951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 309951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 310951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 311951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 312951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case GET_LOCAL_FREQ: { 313951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 314951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen uint64_t freq; 315951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = getLocalFreq(&freq); 316951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 317951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 318951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt64(freq); 319951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 320951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 321951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 322951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 323951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case GET_ESTIMATED_ERROR: { 324951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 325951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int32_t error; 326951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = getEstimatedError(&error); 327951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 328951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 329951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(error); 330951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 331951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 332951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 333951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 334951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case GET_TIMELINE_ID: { 335951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 336951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen uint64_t id; 337951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = getTimelineID(&id); 338951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 339951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 340951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt64(static_cast<int64_t>(id)); 341951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 342951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 343951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 344951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 345951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case GET_STATE: { 346951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 347951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen State state; 348951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = getState(&state); 349951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 350951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 351951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(static_cast<int32_t>(state)); 352951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 353951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 354951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 355951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 356951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case GET_MASTER_ADDRESS: { 357951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 358951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen struct sockaddr_storage addr; 359951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = getMasterAddr(&addr); 360951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 361951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if ((status == OK) && !canSerializeSockaddr(&addr)) { 362951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status = UNKNOWN_ERROR; 363951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 364951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 365951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 366951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 367951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (status == OK) { 368951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen serializeSockaddr(reply, &addr); 369951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 370951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 371951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 372951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 373951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 374951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case REGISTER_LISTENER: { 375951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 376951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen sp<ICommonClockListener> listener = 377951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen interface_cast<ICommonClockListener>(data.readStrongBinder()); 378951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = registerListener(listener); 379951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 380951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 381951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 382951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 383951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case UNREGISTER_LISTENER: { 384951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClock, data, reply); 385951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen sp<ICommonClockListener> listener = 386951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen interface_cast<ICommonClockListener>(data.readStrongBinder()); 387951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen status_t status = unregisterListener(listener); 388951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen reply->writeInt32(status); 389951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return OK; 390951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 391951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 392951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return BBinder::onTransact(code, data, reply, flags); 393951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen} 394951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 395951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen/***** ICommonClockListener *****/ 396951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 397951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenenum { 398951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ON_TIMELINE_CHANGED = IBinder::FIRST_CALL_TRANSACTION, 399951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}; 400951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 401951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenclass BpCommonClockListener : public BpInterface<ICommonClockListener> 402951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen{ 403951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen public: 404951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen BpCommonClockListener(const sp<IBinder>& impl) 405951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen : BpInterface<ICommonClockListener>(impl) {} 406951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 407951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen virtual void onTimelineChanged(uint64_t timelineID) { 408951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen Parcel data, reply; 409951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInterfaceToken( 410951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ICommonClockListener::getInterfaceDescriptor()); 411951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen data.writeInt64(timelineID); 412951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen remote()->transact(ON_TIMELINE_CHANGED, data, &reply); 413951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 414951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}; 415951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 416951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. ChenIMPLEMENT_META_INTERFACE(CommonClockListener, 417951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen "android.os.ICommonClockListener"); 418951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 419951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenstatus_t BnCommonClockListener::onTransact( 420951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { 421951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen switch(code) { 422951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen case ON_TIMELINE_CHANGED: { 423951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen CHECK_INTERFACE(ICommonClockListener, data, reply); 424951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen uint32_t timelineID = data.readInt64(); 425951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen onTimelineChanged(timelineID); 426951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return NO_ERROR; 427951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } break; 428951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 429951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 430951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return BBinder::onTransact(code, data, reply, flags); 431951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen} 432951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 433951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}; // namespace android 434