1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <sys/socket.h> 18 19 #include <common_time/ICommonTimeConfig.h> 20 #include <binder/Parcel.h> 21 22 #include "utils.h" 23 24 namespace android { 25 26 /***** ICommonTimeConfig *****/ 27 28 enum { 29 GET_MASTER_ELECTION_PRIORITY = IBinder::FIRST_CALL_TRANSACTION, 30 SET_MASTER_ELECTION_PRIORITY, 31 GET_MASTER_ELECTION_ENDPOINT, 32 SET_MASTER_ELECTION_ENDPOINT, 33 GET_MASTER_ELECTION_GROUP_ID, 34 SET_MASTER_ELECTION_GROUP_ID, 35 GET_INTERFACE_BINDING, 36 SET_INTERFACE_BINDING, 37 GET_MASTER_ANNOUNCE_INTERVAL, 38 SET_MASTER_ANNOUNCE_INTERVAL, 39 GET_CLIENT_SYNC_INTERVAL, 40 SET_CLIENT_SYNC_INTERVAL, 41 GET_PANIC_THRESHOLD, 42 SET_PANIC_THRESHOLD, 43 GET_AUTO_DISABLE, 44 SET_AUTO_DISABLE, 45 FORCE_NETWORKLESS_MASTER_MODE, 46 }; 47 48 const String16 ICommonTimeConfig::kServiceName("common_time.config"); 49 50 class BpCommonTimeConfig : public BpInterface<ICommonTimeConfig> 51 { 52 public: 53 BpCommonTimeConfig(const sp<IBinder>& impl) 54 : BpInterface<ICommonTimeConfig>(impl) {} 55 56 virtual status_t getMasterElectionPriority(uint8_t *priority) { 57 Parcel data, reply; 58 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 59 status_t status = remote()->transact(GET_MASTER_ELECTION_PRIORITY, 60 data, 61 &reply); 62 if (status == OK) { 63 status = reply.readInt32(); 64 if (status == OK) { 65 *priority = static_cast<uint8_t>(reply.readInt32()); 66 } 67 } 68 69 return status; 70 } 71 72 virtual status_t setMasterElectionPriority(uint8_t priority) { 73 Parcel data, reply; 74 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 75 data.writeInt32(static_cast<int32_t>(priority)); 76 status_t status = remote()->transact(SET_MASTER_ELECTION_PRIORITY, 77 data, 78 &reply); 79 if (status == OK) { 80 status = reply.readInt32(); 81 } 82 83 return status; 84 } 85 86 virtual status_t getMasterElectionEndpoint(struct sockaddr_storage *addr) { 87 Parcel data, reply; 88 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 89 status_t status = remote()->transact(GET_MASTER_ELECTION_ENDPOINT, 90 data, 91 &reply); 92 if (status == OK) { 93 status = reply.readInt32(); 94 if (status == OK) { 95 deserializeSockaddr(&reply, addr); 96 } 97 } 98 99 return status; 100 } 101 102 virtual status_t setMasterElectionEndpoint( 103 const struct sockaddr_storage *addr) { 104 Parcel data, reply; 105 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 106 if (!canSerializeSockaddr(addr)) 107 return BAD_VALUE; 108 if (NULL == addr) { 109 data.writeInt32(0); 110 } else { 111 data.writeInt32(1); 112 serializeSockaddr(&data, addr); 113 } 114 status_t status = remote()->transact(SET_MASTER_ELECTION_ENDPOINT, 115 data, 116 &reply); 117 if (status == OK) { 118 status = reply.readInt32(); 119 } 120 121 return status; 122 } 123 124 virtual status_t getMasterElectionGroupId(uint64_t *id) { 125 Parcel data, reply; 126 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 127 status_t status = remote()->transact(GET_MASTER_ELECTION_GROUP_ID, 128 data, 129 &reply); 130 131 if (status == OK) { 132 status = reply.readInt32(); 133 if (status == OK) { 134 *id = static_cast<uint64_t>(reply.readInt64()); 135 } 136 } 137 138 return status; 139 } 140 141 virtual status_t setMasterElectionGroupId(uint64_t id) { 142 Parcel data, reply; 143 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 144 data.writeInt64(id); 145 status_t status = remote()->transact(SET_MASTER_ELECTION_GROUP_ID, 146 data, 147 &reply); 148 149 if (status == OK) { 150 status = reply.readInt32(); 151 } 152 153 return status; 154 } 155 156 virtual status_t getInterfaceBinding(String16& ifaceName) { 157 Parcel data, reply; 158 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 159 status_t status = remote()->transact(GET_INTERFACE_BINDING, 160 data, 161 &reply); 162 if (status == OK) { 163 status = reply.readInt32(); 164 if (status == OK) { 165 ifaceName = reply.readString16(); 166 } 167 } 168 169 return status; 170 } 171 172 virtual status_t setInterfaceBinding(const String16& ifaceName) { 173 Parcel data, reply; 174 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 175 data.writeString16(ifaceName); 176 status_t status = remote()->transact(SET_INTERFACE_BINDING, 177 data, 178 &reply); 179 if (status == OK) { 180 status = reply.readInt32(); 181 } 182 183 return status; 184 } 185 186 virtual status_t getMasterAnnounceInterval(int *interval) { 187 Parcel data, reply; 188 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 189 status_t status = remote()->transact(GET_MASTER_ANNOUNCE_INTERVAL, 190 data, 191 &reply); 192 if (status == OK) { 193 status = reply.readInt32(); 194 if (status == OK) { 195 *interval = reply.readInt32(); 196 } 197 } 198 199 return status; 200 } 201 202 virtual status_t setMasterAnnounceInterval(int interval) { 203 Parcel data, reply; 204 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 205 data.writeInt32(interval); 206 status_t status = remote()->transact(SET_MASTER_ANNOUNCE_INTERVAL, 207 data, 208 &reply); 209 if (status == OK) { 210 status = reply.readInt32(); 211 } 212 213 return status; 214 } 215 216 virtual status_t getClientSyncInterval(int *interval) { 217 Parcel data, reply; 218 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 219 status_t status = remote()->transact(GET_CLIENT_SYNC_INTERVAL, 220 data, 221 &reply); 222 if (status == OK) { 223 status = reply.readInt32(); 224 if (status == OK) { 225 *interval = reply.readInt32(); 226 } 227 } 228 229 return status; 230 } 231 232 virtual status_t setClientSyncInterval(int interval) { 233 Parcel data, reply; 234 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 235 data.writeInt32(interval); 236 status_t status = remote()->transact(SET_CLIENT_SYNC_INTERVAL, 237 data, 238 &reply); 239 if (status == OK) { 240 status = reply.readInt32(); 241 } 242 243 return status; 244 } 245 246 virtual status_t getPanicThreshold(int *threshold) { 247 Parcel data, reply; 248 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 249 status_t status = remote()->transact(GET_PANIC_THRESHOLD, 250 data, 251 &reply); 252 if (status == OK) { 253 status = reply.readInt32(); 254 if (status == OK) { 255 *threshold = reply.readInt32(); 256 } 257 } 258 259 return status; 260 } 261 262 virtual status_t setPanicThreshold(int threshold) { 263 Parcel data, reply; 264 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 265 data.writeInt32(threshold); 266 status_t status = remote()->transact(SET_PANIC_THRESHOLD, 267 data, 268 &reply); 269 if (status == OK) { 270 status = reply.readInt32(); 271 } 272 273 return status; 274 } 275 276 virtual status_t getAutoDisable(bool *autoDisable) { 277 Parcel data, reply; 278 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 279 status_t status = remote()->transact(GET_AUTO_DISABLE, 280 data, 281 &reply); 282 if (status == OK) { 283 status = reply.readInt32(); 284 if (status == OK) { 285 *autoDisable = (0 != reply.readInt32()); 286 } 287 } 288 289 return status; 290 } 291 292 virtual status_t setAutoDisable(bool autoDisable) { 293 Parcel data, reply; 294 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 295 data.writeInt32(autoDisable ? 1 : 0); 296 status_t status = remote()->transact(SET_AUTO_DISABLE, 297 data, 298 &reply); 299 300 if (status == OK) { 301 status = reply.readInt32(); 302 } 303 304 return status; 305 } 306 307 virtual status_t forceNetworklessMasterMode() { 308 Parcel data, reply; 309 data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor()); 310 status_t status = remote()->transact(FORCE_NETWORKLESS_MASTER_MODE, 311 data, 312 &reply); 313 314 if (status == OK) { 315 status = reply.readInt32(); 316 } 317 318 return status; 319 } 320 }; 321 322 IMPLEMENT_META_INTERFACE(CommonTimeConfig, "android.os.ICommonTimeConfig"); 323 324 status_t BnCommonTimeConfig::onTransact(uint32_t code, 325 const Parcel& data, 326 Parcel* reply, 327 uint32_t flags) { 328 switch(code) { 329 case GET_MASTER_ELECTION_PRIORITY: { 330 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 331 uint8_t priority; 332 status_t status = getMasterElectionPriority(&priority); 333 reply->writeInt32(status); 334 if (status == OK) { 335 reply->writeInt32(static_cast<int32_t>(priority)); 336 } 337 return OK; 338 } break; 339 340 case SET_MASTER_ELECTION_PRIORITY: { 341 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 342 uint8_t priority = static_cast<uint8_t>(data.readInt32()); 343 status_t status = setMasterElectionPriority(priority); 344 reply->writeInt32(status); 345 return OK; 346 } break; 347 348 case GET_MASTER_ELECTION_ENDPOINT: { 349 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 350 struct sockaddr_storage addr; 351 status_t status = getMasterElectionEndpoint(&addr); 352 353 if ((status == OK) && !canSerializeSockaddr(&addr)) { 354 status = UNKNOWN_ERROR; 355 } 356 357 reply->writeInt32(status); 358 359 if (status == OK) { 360 serializeSockaddr(reply, &addr); 361 } 362 363 return OK; 364 } break; 365 366 case SET_MASTER_ELECTION_ENDPOINT: { 367 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 368 struct sockaddr_storage addr; 369 int hasAddr = data.readInt32(); 370 371 status_t status; 372 if (hasAddr) { 373 deserializeSockaddr(&data, &addr); 374 status = setMasterElectionEndpoint(&addr); 375 } else { 376 status = setMasterElectionEndpoint(&addr); 377 } 378 379 reply->writeInt32(status); 380 return OK; 381 } break; 382 383 case GET_MASTER_ELECTION_GROUP_ID: { 384 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 385 uint64_t id; 386 status_t status = getMasterElectionGroupId(&id); 387 reply->writeInt32(status); 388 if (status == OK) { 389 reply->writeInt64(id); 390 } 391 return OK; 392 } break; 393 394 case SET_MASTER_ELECTION_GROUP_ID: { 395 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 396 uint64_t id = static_cast<uint64_t>(data.readInt64()); 397 status_t status = setMasterElectionGroupId(id); 398 reply->writeInt32(status); 399 return OK; 400 } break; 401 402 case GET_INTERFACE_BINDING: { 403 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 404 String16 ret; 405 status_t status = getInterfaceBinding(ret); 406 reply->writeInt32(status); 407 if (status == OK) { 408 reply->writeString16(ret); 409 } 410 return OK; 411 } break; 412 413 case SET_INTERFACE_BINDING: { 414 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 415 String16 ifaceName; 416 ifaceName = data.readString16(); 417 status_t status = setInterfaceBinding(ifaceName); 418 reply->writeInt32(status); 419 return OK; 420 } break; 421 422 case GET_MASTER_ANNOUNCE_INTERVAL: { 423 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 424 int interval; 425 status_t status = getMasterAnnounceInterval(&interval); 426 reply->writeInt32(status); 427 if (status == OK) { 428 reply->writeInt32(interval); 429 } 430 return OK; 431 } break; 432 433 case SET_MASTER_ANNOUNCE_INTERVAL: { 434 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 435 int interval = data.readInt32(); 436 status_t status = setMasterAnnounceInterval(interval); 437 reply->writeInt32(status); 438 return OK; 439 } break; 440 441 case GET_CLIENT_SYNC_INTERVAL: { 442 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 443 int interval; 444 status_t status = getClientSyncInterval(&interval); 445 reply->writeInt32(status); 446 if (status == OK) { 447 reply->writeInt32(interval); 448 } 449 return OK; 450 } break; 451 452 case SET_CLIENT_SYNC_INTERVAL: { 453 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 454 int interval = data.readInt32(); 455 status_t status = setClientSyncInterval(interval); 456 reply->writeInt32(status); 457 return OK; 458 } break; 459 460 case GET_PANIC_THRESHOLD: { 461 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 462 int threshold; 463 status_t status = getPanicThreshold(&threshold); 464 reply->writeInt32(status); 465 if (status == OK) { 466 reply->writeInt32(threshold); 467 } 468 return OK; 469 } break; 470 471 case SET_PANIC_THRESHOLD: { 472 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 473 int threshold = data.readInt32(); 474 status_t status = setPanicThreshold(threshold); 475 reply->writeInt32(status); 476 return OK; 477 } break; 478 479 case GET_AUTO_DISABLE: { 480 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 481 bool autoDisable; 482 status_t status = getAutoDisable(&autoDisable); 483 reply->writeInt32(status); 484 if (status == OK) { 485 reply->writeInt32(autoDisable ? 1 : 0); 486 } 487 return OK; 488 } break; 489 490 case SET_AUTO_DISABLE: { 491 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 492 bool autoDisable = (0 != data.readInt32()); 493 status_t status = setAutoDisable(autoDisable); 494 reply->writeInt32(status); 495 return OK; 496 } break; 497 498 case FORCE_NETWORKLESS_MASTER_MODE: { 499 CHECK_INTERFACE(ICommonTimeConfig, data, reply); 500 status_t status = forceNetworklessMasterMode(); 501 reply->writeInt32(status); 502 return OK; 503 } break; 504 } 505 return BBinder::onTransact(code, data, reply, flags); 506 } 507 508 }; // namespace android 509 510