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