/******************************************************************************* * Copyright (c) 2013, 2014 Red Hat, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat Inc. - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.thym.ios.core.simulator; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.debug.core.IStreamListener; import org.eclipse.debug.core.model.IStreamMonitor; import org.eclipse.thym.core.internal.util.ExternalProcessUtility; import org.eclipse.thym.ios.core.IOSCore; /** * Wrapper around the native binary for controlling the iOS Simulator. * * @author Gorkem Ercan * */ public class IOSSimulator { private String[] environment; private IOSDevice deviceId; private IProgressMonitor monitor; private static class DeviceListParser implements IStreamListener{ private StringBuffer buffer = new StringBuffer(); @Override public void streamAppended(String text, IStreamMonitor monitor) { buffer.append(text); } public List<IOSDevice> getDeviceList(){ if (buffer == null || buffer.length() < 1) return null; try { StringReader reader = new StringReader(buffer.toString()); BufferedReader read = new BufferedReader(reader); String line = null; String iosVersion = null; boolean parsingDevices = false; List<IOSDevice> devices = new ArrayList<IOSDevice>(); while ((line = read.readLine()) != null) { if (line.isEmpty()) continue; if (line.equals("== Devices ==")) { parsingDevices = true; continue; } if (parsingDevices) { if (line.startsWith("==") ){ break; }else if (line.startsWith("--")) { line = line.replace("--", ""); iosVersion = line.trim(); } else { String[] parts = line.split("[\\(\\)]"); if ( parts.length<2 ){ continue; } IOSDevice device = new IOSDevice(); device.setDeviceName(parts[0].trim()); device.setDeviceId(parts[1].trim()); device.setiOSName(iosVersion); devices.add(device); } } } return devices; }catch(IOException e){ IOSCore.log(IStatus.ERROR, "error parsing device list", e); return Collections.emptyList(); } } } public IOSSimulator(IOSDevice deviceId){ this.setDeviceId(deviceId); } public IOSSimulator launch() throws CoreException{ StringBuilder cmdLine = new StringBuilder(); cmdLine.append("xcrun"); cmdLine.append(" instruments -w "); cmdLine.append(getDeviceId().getDeviceId()); ExternalProcessUtility processUtility = new ExternalProcessUtility(); processUtility.execSync(cmdLine.toString(),null, null, null, getProgressMonitor(),environment,null); return this; } public IOSSimulator installApp( String path ) throws CoreException{ StringBuilder cmdLine = new StringBuilder(); cmdLine.append("xcrun"); cmdLine.append(" simctl install "); cmdLine.append(getDeviceId().getDeviceId()).append(" "); cmdLine.append("\"").append( path ).append("\""); ExternalProcessUtility processUtility = new ExternalProcessUtility(); processUtility.execSync(cmdLine.toString(),null, null, null, getProgressMonitor(),environment,null); return this; } public IOSSimulator startApp(String id) throws CoreException{ StringBuilder cmdLine = new StringBuilder(); cmdLine.append("xcrun"); cmdLine.append(" simctl launch "); cmdLine.append(getDeviceId().getDeviceId()).append(" "); cmdLine.append( id ); ExternalProcessUtility processUtility = new ExternalProcessUtility(); processUtility.execSync(cmdLine.toString(),null, null, null, getProgressMonitor(),environment,null); return this; } public static List<IOSDevice> listDevices(IProgressMonitor monitor) throws CoreException{ StringBuilder cmdLine = new StringBuilder(); cmdLine.append("xcrun"); cmdLine.append(" simctl list "); ExternalProcessUtility processUtility = new ExternalProcessUtility(); DeviceListParser parser = new DeviceListParser(); processUtility.execSync(cmdLine.toString(),null, parser, parser, monitor,null ,null); return parser.getDeviceList(); } public static IOSDevice findDevice(String deviceId, IProgressMonitor monitor) throws CoreException{ if(deviceId == null ) return null; List<IOSDevice> devices = listDevices(monitor); if(devices == null ) return null; for (IOSDevice iosDevice : devices) { if(iosDevice.getDeviceId().equals(deviceId)){ return iosDevice; } } return null; } /** * The environment variables set in the process * @param envp */ public IOSSimulator setProcessEnvironmentVariables(String[] envp) { this.environment = envp; return this; } public IOSDevice getDeviceId() { return deviceId; } public void setDeviceId(IOSDevice deviceId) { this.deviceId = deviceId; } private IProgressMonitor getProgressMonitor(){ if(monitor == null){ monitor = new NullProgressMonitor(); } return monitor; } public IOSSimulator setProgressMonitor(IProgressMonitor progressMonitor){ this.monitor = progressMonitor; return this; } }