/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sys/socket.h>
#include <common_time/ICommonTimeConfig.h>
#include <binder/Parcel.h>
#include "utils.h"
namespace android {
/***** ICommonTimeConfig *****/
enum {
GET_MASTER_ELECTION_PRIORITY = IBinder::FIRST_CALL_TRANSACTION,
SET_MASTER_ELECTION_PRIORITY,
GET_MASTER_ELECTION_ENDPOINT,
SET_MASTER_ELECTION_ENDPOINT,
GET_MASTER_ELECTION_GROUP_ID,
SET_MASTER_ELECTION_GROUP_ID,
GET_INTERFACE_BINDING,
SET_INTERFACE_BINDING,
GET_MASTER_ANNOUNCE_INTERVAL,
SET_MASTER_ANNOUNCE_INTERVAL,
GET_CLIENT_SYNC_INTERVAL,
SET_CLIENT_SYNC_INTERVAL,
GET_PANIC_THRESHOLD,
SET_PANIC_THRESHOLD,
GET_AUTO_DISABLE,
SET_AUTO_DISABLE,
FORCE_NETWORKLESS_MASTER_MODE,
};
const String16 ICommonTimeConfig::kServiceName("common_time.config");
class BpCommonTimeConfig : public BpInterface<ICommonTimeConfig>
{
public:
explicit BpCommonTimeConfig(const sp<IBinder>& impl)
: BpInterface<ICommonTimeConfig>(impl) {}
virtual status_t getMasterElectionPriority(uint8_t *priority) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
status_t status = remote()->transact(GET_MASTER_ELECTION_PRIORITY,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
if (status == OK) {
*priority = static_cast<uint8_t>(reply.readInt32());
}
}
return status;
}
virtual status_t setMasterElectionPriority(uint8_t priority) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
data.writeInt32(static_cast<int32_t>(priority));
status_t status = remote()->transact(SET_MASTER_ELECTION_PRIORITY,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
}
return status;
}
virtual status_t getMasterElectionEndpoint(struct sockaddr_storage *addr) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
status_t status = remote()->transact(GET_MASTER_ELECTION_ENDPOINT,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
if (status == OK) {
deserializeSockaddr(&reply, addr);
}
}
return status;
}
virtual status_t setMasterElectionEndpoint(
const struct sockaddr_storage *addr) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
if (!canSerializeSockaddr(addr))
return BAD_VALUE;
if (NULL == addr) {
data.writeInt32(0);
} else {
data.writeInt32(1);
serializeSockaddr(&data, addr);
}
status_t status = remote()->transact(SET_MASTER_ELECTION_ENDPOINT,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
}
return status;
}
virtual status_t getMasterElectionGroupId(uint64_t *id) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
status_t status = remote()->transact(GET_MASTER_ELECTION_GROUP_ID,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
if (status == OK) {
*id = static_cast<uint64_t>(reply.readInt64());
}
}
return status;
}
virtual status_t setMasterElectionGroupId(uint64_t id) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
data.writeInt64(id);
status_t status = remote()->transact(SET_MASTER_ELECTION_GROUP_ID,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
}
return status;
}
virtual status_t getInterfaceBinding(String16& ifaceName) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
status_t status = remote()->transact(GET_INTERFACE_BINDING,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
if (status == OK) {
ifaceName = reply.readString16();
}
}
return status;
}
virtual status_t setInterfaceBinding(const String16& ifaceName) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
data.writeString16(ifaceName);
status_t status = remote()->transact(SET_INTERFACE_BINDING,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
}
return status;
}
virtual status_t getMasterAnnounceInterval(int *interval) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
status_t status = remote()->transact(GET_MASTER_ANNOUNCE_INTERVAL,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
if (status == OK) {
*interval = reply.readInt32();
}
}
return status;
}
virtual status_t setMasterAnnounceInterval(int interval) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
data.writeInt32(interval);
status_t status = remote()->transact(SET_MASTER_ANNOUNCE_INTERVAL,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
}
return status;
}
virtual status_t getClientSyncInterval(int *interval) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
status_t status = remote()->transact(GET_CLIENT_SYNC_INTERVAL,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
if (status == OK) {
*interval = reply.readInt32();
}
}
return status;
}
virtual status_t setClientSyncInterval(int interval) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
data.writeInt32(interval);
status_t status = remote()->transact(SET_CLIENT_SYNC_INTERVAL,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
}
return status;
}
virtual status_t getPanicThreshold(int *threshold) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
status_t status = remote()->transact(GET_PANIC_THRESHOLD,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
if (status == OK) {
*threshold = reply.readInt32();
}
}
return status;
}
virtual status_t setPanicThreshold(int threshold) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
data.writeInt32(threshold);
status_t status = remote()->transact(SET_PANIC_THRESHOLD,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
}
return status;
}
virtual status_t getAutoDisable(bool *autoDisable) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
status_t status = remote()->transact(GET_AUTO_DISABLE,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
if (status == OK) {
*autoDisable = (0 != reply.readInt32());
}
}
return status;
}
virtual status_t setAutoDisable(bool autoDisable) {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
data.writeInt32(autoDisable ? 1 : 0);
status_t status = remote()->transact(SET_AUTO_DISABLE,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
}
return status;
}
virtual status_t forceNetworklessMasterMode() {
Parcel data, reply;
data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
status_t status = remote()->transact(FORCE_NETWORKLESS_MASTER_MODE,
data,
&reply);
if (status == OK) {
status = reply.readInt32();
}
return status;
}
};
IMPLEMENT_META_INTERFACE(CommonTimeConfig, "android.os.ICommonTimeConfig");
status_t BnCommonTimeConfig::onTransact(uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags) {
switch(code) {
case GET_MASTER_ELECTION_PRIORITY: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
uint8_t priority;
status_t status = getMasterElectionPriority(&priority);
reply->writeInt32(status);
if (status == OK) {
reply->writeInt32(static_cast<int32_t>(priority));
}
return OK;
} break;
case SET_MASTER_ELECTION_PRIORITY: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
uint8_t priority = static_cast<uint8_t>(data.readInt32());
status_t status = setMasterElectionPriority(priority);
reply->writeInt32(status);
return OK;
} break;
case GET_MASTER_ELECTION_ENDPOINT: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
struct sockaddr_storage addr;
status_t status = getMasterElectionEndpoint(&addr);
if ((status == OK) && !canSerializeSockaddr(&addr)) {
status = UNKNOWN_ERROR;
}
reply->writeInt32(status);
if (status == OK) {
serializeSockaddr(reply, &addr);
}
return OK;
} break;
case SET_MASTER_ELECTION_ENDPOINT: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
struct sockaddr_storage addr;
int hasAddr = data.readInt32();
status_t status;
if (hasAddr) {
deserializeSockaddr(&data, &addr);
status = setMasterElectionEndpoint(&addr);
} else {
status = setMasterElectionEndpoint(&addr);
}
reply->writeInt32(status);
return OK;
} break;
case GET_MASTER_ELECTION_GROUP_ID: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
uint64_t id;
status_t status = getMasterElectionGroupId(&id);
reply->writeInt32(status);
if (status == OK) {
reply->writeInt64(id);
}
return OK;
} break;
case SET_MASTER_ELECTION_GROUP_ID: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
uint64_t id = static_cast<uint64_t>(data.readInt64());
status_t status = setMasterElectionGroupId(id);
reply->writeInt32(status);
return OK;
} break;
case GET_INTERFACE_BINDING: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
String16 ret;
status_t status = getInterfaceBinding(ret);
reply->writeInt32(status);
if (status == OK) {
reply->writeString16(ret);
}
return OK;
} break;
case SET_INTERFACE_BINDING: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
String16 ifaceName;
ifaceName = data.readString16();
status_t status = setInterfaceBinding(ifaceName);
reply->writeInt32(status);
return OK;
} break;
case GET_MASTER_ANNOUNCE_INTERVAL: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
int interval;
status_t status = getMasterAnnounceInterval(&interval);
reply->writeInt32(status);
if (status == OK) {
reply->writeInt32(interval);
}
return OK;
} break;
case SET_MASTER_ANNOUNCE_INTERVAL: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
int interval = data.readInt32();
status_t status = setMasterAnnounceInterval(interval);
reply->writeInt32(status);
return OK;
} break;
case GET_CLIENT_SYNC_INTERVAL: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
int interval;
status_t status = getClientSyncInterval(&interval);
reply->writeInt32(status);
if (status == OK) {
reply->writeInt32(interval);
}
return OK;
} break;
case SET_CLIENT_SYNC_INTERVAL: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
int interval = data.readInt32();
status_t status = setClientSyncInterval(interval);
reply->writeInt32(status);
return OK;
} break;
case GET_PANIC_THRESHOLD: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
int threshold;
status_t status = getPanicThreshold(&threshold);
reply->writeInt32(status);
if (status == OK) {
reply->writeInt32(threshold);
}
return OK;
} break;
case SET_PANIC_THRESHOLD: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
int threshold = data.readInt32();
status_t status = setPanicThreshold(threshold);
reply->writeInt32(status);
return OK;
} break;
case GET_AUTO_DISABLE: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
bool autoDisable;
status_t status = getAutoDisable(&autoDisable);
reply->writeInt32(status);
if (status == OK) {
reply->writeInt32(autoDisable ? 1 : 0);
}
return OK;
} break;
case SET_AUTO_DISABLE: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
bool autoDisable = (0 != data.readInt32());
status_t status = setAutoDisable(autoDisable);
reply->writeInt32(status);
return OK;
} break;
case FORCE_NETWORKLESS_MASTER_MODE: {
CHECK_INTERFACE(ICommonTimeConfig, data, reply);
status_t status = forceNetworklessMasterMode();
reply->writeInt32(status);
return OK;
} break;
}
return BBinder::onTransact(code, data, reply, flags);
}
}; // namespace android