140c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown/*
240c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown * Copyright (C) 2013 The Android Open Source Project
340c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown *
440c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
540c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown * you may not use this file except in compliance with the License.
640c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown * You may obtain a copy of the License at
740c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown *
840c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
940c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown *
1040c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown * Unless required by applicable law or agreed to in writing, software
1140c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1240c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1340c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown * See the License for the specific language governing permissions and
1440c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown * limitations under the License.
1540c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown */
1640c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
1740c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown#define LOG_TAG "InputFlinger"
1840c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
1940c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown#include <stdint.h>
2040c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown#include <sys/types.h>
21a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <unistd.h>
2240c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
2340c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown#include <binder/IPCThreadState.h>
2440c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown#include <binder/PermissionCache.h>
256f783602c05c519238200fed55b0afa097737ca1Michael Wright#include <hardware/input.h>
267823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn#include <log/log.h>
2740c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown#include <private/android_filesystem_config.h>
2840c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
29a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include "InputFlinger.h"
30a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include "InputDriver.h"
31a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn
3240c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brownnamespace android {
3340c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
3440c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brownconst String16 sAccessInputFlingerPermission("android.permission.ACCESS_INPUT_FLINGER");
3540c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brownconst String16 sDumpPermission("android.permission.DUMP");
3640c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
3740c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
3840c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff BrownInputFlinger::InputFlinger() :
3940c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown        BnInputFlinger() {
4040c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    ALOGI("InputFlinger is starting");
416f783602c05c519238200fed55b0afa097737ca1Michael Wright    mHost = new InputHost();
426f783602c05c519238200fed55b0afa097737ca1Michael Wright    mHost->registerInputDriver(new InputDriver(INPUT_INSTANCE_EVDEV));
4340c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown}
4440c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
4540c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff BrownInputFlinger::~InputFlinger() {
4640c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown}
4740c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
4840c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brownstatus_t InputFlinger::dump(int fd, const Vector<String16>& args) {
4940c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    String8 result;
5040c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    const IPCThreadState* ipc = IPCThreadState::self();
5140c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    const int pid = ipc->getCallingPid();
5240c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    const int uid = ipc->getCallingUid();
5340c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    if ((uid != AID_SHELL)
5440c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown            && !PermissionCache::checkPermission(sDumpPermission, pid, uid)) {
5540c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown        result.appendFormat("Permission Denial: "
5640c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown                "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
5740c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    } else {
5840c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown        dumpInternal(result);
5940c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    }
6040c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    write(fd, result.string(), result.size());
6140c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    return OK;
6240c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown}
6340c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
6440c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brownvoid InputFlinger::dumpInternal(String8& result) {
6540c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown    result.append("INPUT FLINGER (dumpsys inputflinger)\n");
666f783602c05c519238200fed55b0afa097737ca1Michael Wright    mHost->dump(result);
6740c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown}
6840c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown
6940c9e0a3989222b4c27c88f54b6acf67b58a68cfJeff Brown}; // namespace android
70