1b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood/*
2b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Copyright (C) 2011 The Android Open Source Project
3b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood *
4b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
5b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * you may not use this file except in compliance with the License.
6b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * You may obtain a copy of the License at
7b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood *
8b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
9b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood *
10b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * Unless required by applicable law or agreed to in writing, software
11b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
12b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * See the License for the specific language governing permissions an
14b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood * limitations under the License.
15b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood */
16b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
17b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodpackage com.android.server;
18b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
19b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.content.Context;
20b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.hardware.ISerialManager;
21b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport android.os.ParcelFileDescriptor;
22b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
23b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.io.File;
24b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodimport java.util.ArrayList;
25b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
26b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodpublic class SerialService extends ISerialManager.Stub {
27b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
28b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private final Context mContext;
29b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private final String[] mSerialPorts;
30b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
31b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    public SerialService(Context context) {
32b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        mContext = context;
33b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        mSerialPorts = context.getResources().getStringArray(
34b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                com.android.internal.R.array.config_serialPorts);
35b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
36b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
37b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    public String[] getSerialPorts() {
38b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.SERIAL_PORT, null);
39b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
40b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        ArrayList<String> ports = new ArrayList<String>();
41b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        for (int i = 0; i < mSerialPorts.length; i++) {
42b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            String path = mSerialPorts[i];
43b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            if (new File(path).exists()) {
44b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood                ports.add(path);
45b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood            }
46b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        }
47b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        String[] result = new String[ports.size()];
48b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        ports.toArray(result);
49b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        return result;
50b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
51b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
52b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    public ParcelFileDescriptor openSerialPort(String path) {
53b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.SERIAL_PORT, null);
5480248d44b559442752510af2543c484bd42c961eMike Lockwood        for (int i = 0; i < mSerialPorts.length; i++) {
5580248d44b559442752510af2543c484bd42c961eMike Lockwood            if (mSerialPorts[i].equals(path)) {
5680248d44b559442752510af2543c484bd42c961eMike Lockwood                return native_open(path);
5780248d44b559442752510af2543c484bd42c961eMike Lockwood            }
5880248d44b559442752510af2543c484bd42c961eMike Lockwood        }
5980248d44b559442752510af2543c484bd42c961eMike Lockwood        throw new IllegalArgumentException("Invalid serial port " + path);
60b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    }
61b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood
62b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood    private native ParcelFileDescriptor native_open(String path);
63b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood}
64