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:
BpCommonTimeConfig(const sp<IBinder> & impl)53 BpCommonTimeConfig(const sp<IBinder>& impl)
54 : BpInterface<ICommonTimeConfig>(impl) {}
55
getMasterElectionPriority(uint8_t * priority)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
setMasterElectionPriority(uint8_t priority)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
getMasterElectionEndpoint(struct sockaddr_storage * addr)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
setMasterElectionEndpoint(const struct sockaddr_storage * addr)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
getMasterElectionGroupId(uint64_t * id)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
setMasterElectionGroupId(uint64_t id)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
getInterfaceBinding(String16 & ifaceName)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
setInterfaceBinding(const String16 & ifaceName)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
getMasterAnnounceInterval(int * interval)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
setMasterAnnounceInterval(int interval)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
getClientSyncInterval(int * interval)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
setClientSyncInterval(int interval)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
getPanicThreshold(int * threshold)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
setPanicThreshold(int threshold)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
getAutoDisable(bool * autoDisable)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
setAutoDisable(bool autoDisable)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
forceNetworklessMasterMode()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
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)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