/*******************************************************************************
* Copyright (c) 2000, 2010 QNX Software Systems and others.
* 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:
* QNX Software Systems - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.utils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
/**
* @noextend This class is not intended to be subclassed by clients.
*/
public class CygPath {
boolean useOldCygPath = false;
private final Process cygpath;
private final BufferedReader stdout;
private final BufferedWriter stdin;
private boolean fSpaceIsSeparator= false;
public CygPath(String command) throws IOException {
if (!Platform.getOS().equals(Platform.OS_WIN32))
// Don't run this on non-windows platforms
throw new IOException("Not Windows"); //$NON-NLS-1$
String[] args = {command, "--windows", "--file", "-"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
cygpath = Runtime.getRuntime().exec(args);
stdin = new BufferedWriter(new OutputStreamWriter(cygpath.getOutputStream()));
stdout = new BufferedReader(new InputStreamReader(cygpath.getInputStream()));
try {
String test= getFileName("a b"); //$NON-NLS-1$
if ("a".equals(test)) { //$NON-NLS-1$
// Bug 298615: This version seems to treat space as a separator
fSpaceIsSeparator= true;
// Read off second part
stdout.readLine();
}
} catch (IOException e) {
// older cygwin
dispose();
useOldCygPath = true;
}
}
public CygPath() throws IOException {
this("cygpath"); //$NON-NLS-1$
}
public String getFileName(String name) throws IOException {
// bug 214603, empty names don't create a response
if (name == null || name.length() == 0)
return name;
if (useOldCygPath) {
return internalgetFileName(name);
}
if (fSpaceIsSeparator && name.indexOf(' ') != -1) {
return internalgetFileName(name);
}
// Clear everything from stdout
while(stdout.ready()) {
stdout.read();
}
stdin.write(name + "\n"); //$NON-NLS-1$
stdin.flush();
String str = stdout.readLine();
if (str != null) {
return str.trim();
}
throw new IOException();
}
public void dispose() {
if (!useOldCygPath) {
try {
stdout.close();
stdin.close();
cygpath.getErrorStream().close();
} catch (IOException e) {
}
cygpath.destroy();
}
}
private String internalgetFileName(String path) throws IOException {
Process cygPath = null;
BufferedReader reader = null;
try {
cygPath = Runtime.getRuntime().exec(new String[]{"cygpath", "-w", path}); //$NON-NLS-1$ //$NON-NLS-2$
reader = new BufferedReader(new InputStreamReader(cygPath.getInputStream()));
String newPath = reader.readLine();
IPath ipath;
if (path != null && !path.equals("")) { //$NON-NLS-1$
ipath = new Path(newPath);
} else {
ipath = new Path(path);
}
if (ipath.isAbsolute() && !ipath.toFile().exists() && ipath.segment(0).length() == 1) {
// look like it could be /c/... path
StringBuffer drive = new StringBuffer(ipath.segment(0));
drive.append(':');
ipath = ipath.removeFirstSegments(1);
ipath = ipath.makeAbsolute();
ipath = ipath.setDevice(drive.toString());
}
return ipath.toOSString();
} finally {
if (reader != null) {
reader.close();
}
if (cygPath != null) {
cygPath.destroy();
}
}
}
}