1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-04 14:55:41 +02:00
Signed-off-by: Greg Watson <g.watson@computer.org>
This commit is contained in:
Greg Watson 2014-01-27 18:15:25 -05:00
parent 7bd13e741b
commit acbd43742d
8 changed files with 81 additions and 103 deletions

View file

@ -23,6 +23,7 @@ import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jsch.core.IJSchService; import org.eclipse.jsch.core.IJSchService;
import org.eclipse.osgi.util.NLS;
import org.eclipse.remote.core.IRemoteConnection; import org.eclipse.remote.core.IRemoteConnection;
import org.eclipse.remote.core.IRemoteConnectionChangeEvent; import org.eclipse.remote.core.IRemoteConnectionChangeEvent;
import org.eclipse.remote.core.IRemoteConnectionChangeListener; import org.eclipse.remote.core.IRemoteConnectionChangeListener;
@ -49,8 +50,6 @@ import com.jcraft.jsch.UserInfo;
* @since 5.0 * @since 5.0
*/ */
public class JSchConnection implements IRemoteConnection { public class JSchConnection implements IRemoteConnection {
private final boolean logging = false;
/** /**
* Class to supply credentials from connection attributes without user interaction. * Class to supply credentials from connection attributes without user interaction.
*/ */
@ -62,6 +61,22 @@ public class JSchConnection implements IRemoteConnection {
fAuthenticator = authenticator; fAuthenticator = authenticator;
} }
@Override
public String getPassphrase() {
if (logging) {
System.out.println("getPassphrase"); //$NON-NLS-1$
}
return JSchConnection.this.getPassphrase();
}
@Override
public String getPassword() {
if (logging) {
System.out.println("getPassword"); //$NON-NLS-1$
}
return JSchConnection.this.getPassword();
}
@Override @Override
public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt,
boolean[] echo) { boolean[] echo) {
@ -81,19 +96,22 @@ public class JSchConnection implements IRemoteConnection {
} }
@Override @Override
public String getPassphrase() { public boolean promptPassphrase(String message) {
if (logging) { if (logging) {
System.out.println("getPassphrase"); //$NON-NLS-1$ System.out.println("promptPassphrase:" + message); //$NON-NLS-1$
} }
return JSchConnection.this.getPassphrase(); if (firstTry && !getPassphrase().equals("")) { //$NON-NLS-1$
firstTry = false;
return true;
} }
if (fAuthenticator != null) {
@Override PasswordAuthentication auth = fAuthenticator.prompt(null, message);
public String getPassword() { if (auth == null) {
if (logging) { return false;
System.out.println("getPassword"); //$NON-NLS-1$
} }
return JSchConnection.this.getPassword(); fAttributes.setSecureAttribute(JSchConnectionAttributes.PASSPHRASE_ATTR, new String(auth.getPassword()));
}
return true;
} }
@Override @Override
@ -116,25 +134,6 @@ public class JSchConnection implements IRemoteConnection {
return true; return true;
} }
@Override
public boolean promptPassphrase(String message) {
if (logging) {
System.out.println("promptPassphrase:" + message); //$NON-NLS-1$
}
if (firstTry && !getPassphrase().equals("")) { //$NON-NLS-1$
firstTry = false;
return true;
}
if (fAuthenticator != null) {
PasswordAuthentication auth = fAuthenticator.prompt(null, message);
if (auth == null) {
return false;
}
fAttributes.setSecureAttribute(JSchConnectionAttributes.PASSPHRASE_ATTR, new String(auth.getPassword()));
}
return true;
}
@Override @Override
public boolean promptYesNo(String message) { public boolean promptYesNo(String message) {
if (logging) { if (logging) {
@ -160,6 +159,8 @@ public class JSchConnection implements IRemoteConnection {
} }
} }
private final boolean logging = false;
public static final int DEFAULT_PORT = 22; public static final int DEFAULT_PORT = 22;
public static final int DEFAULT_TIMEOUT = 5; public static final int DEFAULT_TIMEOUT = 5;
public static final boolean DEFAULT_IS_PASSWORD = true; public static final boolean DEFAULT_IS_PASSWORD = true;
@ -273,6 +274,22 @@ public class JSchConnection implements IRemoteConnection {
return getName().compareTo(o.getName()); return getName().compareTo(o.getName());
} }
/**
* Execute the command and return the result as a string.
*
* @param cmd
* command to execute
* @param monitor
* progress monitor
* @return result of command
* @throws RemoteConnectionException
*/
private String executeCommand(String cmd, IProgressMonitor monitor) throws RemoteConnectionException {
ExecCommand exec = new ExecCommand(this);
monitor.subTask(NLS.bind(Messages.JSchConnection_Executing_command, cmd));
return exec.setCommand(cmd).getResult(monitor).trim();
}
/** /**
* Notify all fListeners when this connection's status changes. * Notify all fListeners when this connection's status changes.
* *
@ -439,9 +456,8 @@ public class JSchConnection implements IRemoteConnection {
*/ */
private String getCwd(IProgressMonitor monitor) { private String getCwd(IProgressMonitor monitor) {
SubMonitor subMon = SubMonitor.convert(monitor, 10); SubMonitor subMon = SubMonitor.convert(monitor, 10);
ExecCommand exec = new ExecCommand(this);
try { try {
return exec.setCommand("pwd").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ return executeCommand("pwd", subMon.newChild(10)); //$NON-NLS-1$
} catch (RemoteConnectionException e) { } catch (RemoteConnectionException e) {
// Ignore // Ignore
} }
@ -660,8 +676,7 @@ public class JSchConnection implements IRemoteConnection {
private void loadEnv(IProgressMonitor monitor) throws RemoteConnectionException { private void loadEnv(IProgressMonitor monitor) throws RemoteConnectionException {
SubMonitor subMon = SubMonitor.convert(monitor, 10); SubMonitor subMon = SubMonitor.convert(monitor, 10);
ExecCommand exec = new ExecCommand(this); String env = executeCommand("printenv", subMon.newChild(10)); //$NON-NLS-1$
String env = exec.setCommand("printenv").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$
String[] vars = env.split("\n"); //$NON-NLS-1$ String[] vars = env.split("\n"); //$NON-NLS-1$
for (String var : vars) { for (String var : vars) {
String[] kv = var.split("="); //$NON-NLS-1$ String[] kv = var.split("="); //$NON-NLS-1$
@ -728,31 +743,30 @@ public class JSchConnection implements IRemoteConnection {
fProperties.put(LINE_SEPARATOR_PROPERTY, "\n"); //$NON-NLS-1$ fProperties.put(LINE_SEPARATOR_PROPERTY, "\n"); //$NON-NLS-1$
fProperties.put(USER_HOME_PROPERTY, getWorkingDirectory()); fProperties.put(USER_HOME_PROPERTY, getWorkingDirectory());
ExecCommand exec = new ExecCommand(this);
String osVersion; String osVersion;
String osArch; String osArch;
String osName = exec.setCommand("uname").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ String osName = executeCommand("uname", subMon.newChild(10)); //$NON-NLS-1$
if (osName.equalsIgnoreCase("Linux")) { //$NON-NLS-1$ if (osName.equalsIgnoreCase("Linux")) { //$NON-NLS-1$
osArch = exec.setCommand("uname -m").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ osArch = executeCommand("uname -m", subMon.newChild(10)); //$NON-NLS-1$
osVersion = exec.setCommand("uname -r").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ osVersion = executeCommand("uname -r", subMon.newChild(10)); //$NON-NLS-1$
} else if (osName.equalsIgnoreCase("Darwin")) { //$NON-NLS-1$ } else if (osName.equalsIgnoreCase("Darwin")) { //$NON-NLS-1$
osName = exec.setCommand("sw_vers -productName").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ osName = executeCommand("sw_vers -productName", subMon.newChild(10)); //$NON-NLS-1$
osVersion = exec.setCommand("sw_vers -productVersion").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ osVersion = executeCommand("sw_vers -productVersion", subMon.newChild(10)); //$NON-NLS-1$
osArch = exec.setCommand("uname -m").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ osArch = executeCommand("uname -m", subMon.newChild(10)); //$NON-NLS-1$
if (osArch.equalsIgnoreCase("i386")) { //$NON-NLS-1$ if (osArch.equalsIgnoreCase("i386")) { //$NON-NLS-1$
String opt = exec.setCommand("sysctl -n hw.optional.x86_64").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ String opt = executeCommand("sysctl -n hw.optional.x86_64", subMon.newChild(10)); //$NON-NLS-1$
if (opt.equals("1")) { //$NON-NLS-1$ if (opt.equals("1")) { //$NON-NLS-1$
osArch = "x86_64"; //$NON-NLS-1$ osArch = "x86_64"; //$NON-NLS-1$
} }
} }
} else if (osName.equalsIgnoreCase("AIX")) { //$NON-NLS-1$ } else if (osName.equalsIgnoreCase("AIX")) { //$NON-NLS-1$
osArch = exec.setCommand("uname -p").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ osArch = executeCommand("uname -p", subMon.newChild(10)); //$NON-NLS-1$
osVersion = exec.setCommand("oslevel").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ osVersion = executeCommand("oslevel", subMon.newChild(10)); //$NON-NLS-1$
if (osArch.equalsIgnoreCase("powerpc")) { //$NON-NLS-1$ if (osArch.equalsIgnoreCase("powerpc")) { //$NON-NLS-1$
/* Make the architecture match what Linux produces: either ppc or ppc64 */ /* Make the architecture match what Linux produces: either ppc or ppc64 */
osArch = "ppc"; //$NON-NLS-1$ osArch = "ppc"; //$NON-NLS-1$
/* Get Kernel type either 32-bit or 64-bit */ /* Get Kernel type either 32-bit or 64-bit */
String opt = exec.setCommand("prtconf -k").getResult(subMon.newChild(10)).trim(); //$NON-NLS-1$ String opt = executeCommand("prtconf -k", subMon.newChild(10)); //$NON-NLS-1$
if (opt.indexOf("64-bit") > 0) { //$NON-NLS-1$ if (opt.indexOf("64-bit") > 0) { //$NON-NLS-1$
osArch += "64"; //$NON-NLS-1$ osArch += "64"; //$NON-NLS-1$
} }

View file

@ -12,6 +12,7 @@
package org.eclipse.remote.internal.jsch.core.commands; package org.eclipse.remote.internal.jsch.core.commands;
import java.io.IOException; import java.io.IOException;
import java.text.MessageFormat;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@ -45,6 +46,9 @@ import com.jcraft.jsch.SftpProgressMonitor;
public abstract class AbstractRemoteCommand<T> { public abstract class AbstractRemoteCommand<T> {
protected static class CommandProgressMonitor implements SftpProgressMonitor { protected static class CommandProgressMonitor implements SftpProgressMonitor {
private final IProgressMonitor fMonitor; private final IProgressMonitor fMonitor;
private double fWorkPercentFactor;
private Long fMaxWorkKB;
private long fWorkToDate;
public CommandProgressMonitor(IProgressMonitor monitor) { public CommandProgressMonitor(IProgressMonitor monitor) {
fMonitor = monitor; fMonitor = monitor;
@ -52,6 +56,13 @@ public abstract class AbstractRemoteCommand<T> {
@Override @Override
public boolean count(long count) { public boolean count(long count) {
fWorkToDate += count;
Long workToDateKB = new Long(fWorkToDate / 1024L);
Double workPercent = new Double(fWorkPercentFactor * fWorkToDate);
String subDesc = MessageFormat.format(Messages.AbstractRemoteCommand_format,
new Object[] { workToDateKB, fMaxWorkKB, workPercent });
fMonitor.subTask(subDesc);
fMonitor.worked((int) count); fMonitor.worked((int) count);
return !(fMonitor.isCanceled()); return !(fMonitor.isCanceled());
} }
@ -63,9 +74,10 @@ public abstract class AbstractRemoteCommand<T> {
@Override @Override
public void init(int op, String src, String dest, long max) { public void init(int op, String src, String dest, long max) {
String srcFile = new Path(src).lastSegment(); fWorkPercentFactor = 1.0 / max;
String desc = srcFile; fMaxWorkKB = new Long(max / 1024L);
fMonitor.beginTask(desc, (int) max); fWorkToDate = 0;
fMonitor.beginTask(new Path(src).lastSegment(), (int) max);
} }
} }

View file

@ -11,7 +11,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.remote.core.exception.RemoteConnectionException; import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.JSchConnection; import org.eclipse.remote.internal.jsch.core.JSchConnection;
import org.eclipse.remote.internal.jsch.core.messages.Messages;
import com.jcraft.jsch.ChannelSftp.LsEntry; import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSchException; import com.jcraft.jsch.JSchException;
@ -60,7 +59,6 @@ public class ChildInfosCommand extends AbstractRemoteCommand<IFileInfo[]> {
} }
}; };
try { try {
subMon.subTask(Messages.ChildInfosCommand_Get_file_attributes);
return c.getResult(subMon.newChild(10)); return c.getResult(subMon.newChild(10));
} catch (SftpException e) { } catch (SftpException e) {
throw new RemoteConnectionException(e.getMessage()); throw new RemoteConnectionException(e.getMessage());

View file

@ -7,7 +7,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.remote.core.exception.RemoteConnectionException; import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.JSchConnection; import org.eclipse.remote.internal.jsch.core.JSchConnection;
import org.eclipse.remote.internal.jsch.core.messages.Messages;
import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException; import com.jcraft.jsch.JSchException;
@ -34,7 +33,6 @@ public class FetchInfoCommand extends AbstractRemoteCommand<IFileInfo> {
}; };
SftpATTRS attrs; SftpATTRS attrs;
try { try {
subMon.subTask(Messages.FetchInfoCommand_Fetch_info);
attrs = c.getResult(subMon.newChild(10)); attrs = c.getResult(subMon.newChild(10));
return convertToFileInfo(fRemotePath, attrs, subMon.newChild(10)); return convertToFileInfo(fRemotePath, attrs, subMon.newChild(10));
} catch (SftpException e) { } catch (SftpException e) {

View file

@ -6,7 +6,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.remote.core.exception.RemoteConnectionException; import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.JSchConnection; import org.eclipse.remote.internal.jsch.core.JSchConnection;
import org.eclipse.remote.internal.jsch.core.messages.Messages;
import com.jcraft.jsch.JSchException; import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException; import com.jcraft.jsch.SftpException;
@ -45,7 +44,6 @@ public class MkdirCommand extends AbstractRemoteCommand<Void> {
} }
}; };
try { try {
subMon.subTask(Messages.MkdirCommand_Create_directory);
c.getResult(subMon.newChild(10)); c.getResult(subMon.newChild(10));
} catch (SftpException e) { } catch (SftpException e) {
throw new RemoteConnectionException(e.getMessage()); throw new RemoteConnectionException(e.getMessage());

View file

@ -7,7 +7,6 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.remote.core.exception.RemoteConnectionException; import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.JSchConnection; import org.eclipse.remote.internal.jsch.core.JSchConnection;
import org.eclipse.remote.internal.jsch.core.messages.Messages;
import com.jcraft.jsch.JSchException; import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException; import com.jcraft.jsch.SftpException;
@ -63,7 +62,6 @@ public class PutInfoCommand extends AbstractRemoteCommand<Void> {
} }
}; };
try { try {
subMon.subTask(Messages.PutInfoCommand_Change_permissions);
c.getResult(subMon.newChild(10)); c.getResult(subMon.newChild(10));
} catch (SftpException e) { } catch (SftpException e) {
throw new RemoteConnectionException(e.getMessage()); throw new RemoteConnectionException(e.getMessage());
@ -80,7 +78,6 @@ public class PutInfoCommand extends AbstractRemoteCommand<Void> {
} }
}; };
try { try {
subMon.subTask(Messages.PutInfoCommand_Set_modified_time);
c.getResult(subMon.newChild(10)); c.getResult(subMon.newChild(10));
} catch (SftpException e) { } catch (SftpException e) {
throw new RemoteConnectionException(e.getMessage()); throw new RemoteConnectionException(e.getMessage());

View file

@ -16,21 +16,18 @@ import org.eclipse.osgi.util.NLS;
public class Messages extends NLS { public class Messages extends NLS {
private static final String BUNDLE_ID = "org.eclipse.remote.internal.jsch.core.messages.messages"; //$NON-NLS-1$ private static final String BUNDLE_ID = "org.eclipse.remote.internal.jsch.core.messages.messages"; //$NON-NLS-1$
public static String AbstractRemoteCommand_Execution_exception; public static String AbstractRemoteCommand_format;
public static String AbstractRemoteCommand_Get_symlink_target; public static String AbstractRemoteCommand_Get_symlink_target;
public static String AbstractRemoteCommand_Operation_cancelled_by_user; public static String AbstractRemoteCommand_Operation_cancelled_by_user;
public static String AuthInfo_Authentication_message; public static String AuthInfo_Authentication_message;
public static String ChildInfosCommand_Get_file_attributes;
public static String DeleteCommand_Remove_file;
public static String ExecCommand_Exec_command; public static String ExecCommand_Exec_command;
public static String FetchInfoCommand_Fetch_info;
public static String GetInputStreamCommand_Get_input_stream;
public static String JSchConnection_Connection_was_cancelled; public static String JSchConnection_Connection_was_cancelled;
public static String JSchConnection_connectionNotOpen; public static String JSchConnection_connectionNotOpen;
public static String JSchConnection_Executing_command;
public static String JSchConnection_remote_address_must_be_set; public static String JSchConnection_remote_address_must_be_set;
public static String JSchConnection_remotePort; public static String JSchConnection_remotePort;
public static String RemoteToolsConnection_open;
public static String JSchConnection_forwarding; public static String JSchConnection_forwarding;
public static String JSchConnection_Remote_host_does_not_support_sftp; public static String JSchConnection_Remote_host_does_not_support_sftp;
public static String JSchConnection_Unable_to_open_sftp_channel; public static String JSchConnection_Unable_to_open_sftp_channel;
@ -46,22 +43,6 @@ public class Messages extends NLS {
public static String JschFileStore_No_remote_services_found_for_URI; public static String JschFileStore_No_remote_services_found_for_URI;
public static String JschFileStore_The_file_of_name_already_exists; public static String JschFileStore_The_file_of_name_already_exists;
public static String JschFileStore_The_parent_of_directory_does_not_exist; public static String JschFileStore_The_parent_of_directory_does_not_exist;
public static String MkdirCommand_Create_directory;
public static String PutInfoCommand_Change_permissions;
public static String PutInfoCommand_Set_modified_time;
public static String RemoteToolsFileStore_0;
public static String RemoteToolsFileStore_1;
public static String RemoteToolsFileStore_2;
public static String RemoteToolsFileStore_3;
public static String RemoteToolsFileStore_4;
public static String RemoteToolsFileStore_5;
public static String RemoteToolsFileStore_6;
public static String RemoteToolsFileStore_7;
public static String RemoteToolsFileStore_8;
public static String RemoteToolsFileStore_10;
public static String RemoteToolsFileStore_12;
public static String RemoteToolsFileStore_13;
public static String RemoteToolsFileStore_14;
static { static {
// load message values from bundle file // load message values from bundle file

View file

@ -8,20 +8,16 @@
# Contributors: # Contributors:
# IBM Corporation - initial implementation # IBM Corporation - initial implementation
############################################################################### ###############################################################################
AbstractRemoteCommand_format={0,number,integer} KB of {1,number,integer} KB complete ({2,number,percent})
AbstractRemoteCommand_Get_symlink_target=Get symlink target AbstractRemoteCommand_Get_symlink_target=Get symlink target
AbstractRemoteCommand_Operation_cancelled_by_user=Operation cancelled by user AbstractRemoteCommand_Operation_cancelled_by_user=Operation cancelled by user
AbstractRemoteCommand_Execution_exception=Execution exception
AuthInfo_Authentication_message=Authentication Message AuthInfo_Authentication_message=Authentication Message
ChildInfosCommand_Get_file_attributes=Get file attributes
DeleteCommand_Remove_file=Remove file
ExecCommand_Exec_command=Executing command "{0}" ExecCommand_Exec_command=Executing command "{0}"
FetchInfoCommand_Fetch_info=Fetch info
GetInputStreamCommand_Get_input_stream=Get input stream
JSchConnection_Connection_was_cancelled=Connection was cancelled JSchConnection_Connection_was_cancelled=Connection was cancelled
JSchConnection_connectionNotOpen=Connection is not open JSchConnection_connectionNotOpen=Connection is not open
JSchConnection_Executing_command=Executing command "{0}"
JSchConnection_remote_address_must_be_set=Remote address must be set before opening connection JSchConnection_remote_address_must_be_set=Remote address must be set before opening connection
JSchConnection_remotePort=Could not allocate remote port JSchConnection_remotePort=Could not allocate remote port
RemoteToolsConnection_open=Opening connection...
JSchConnection_forwarding=Setting up remote forwarding JSchConnection_forwarding=Setting up remote forwarding
JSchConnection_Remote_host_does_not_support_sftp=Remote host does not support sftp. Remote functionality requires sftp to be enabled JSchConnection_Remote_host_does_not_support_sftp=Remote host does not support sftp. Remote functionality requires sftp to be enabled
JSchConnection_Unable_to_open_sftp_channel=Unable to open sftp channel: check sftp is enabled on remote host JSchConnection_Unable_to_open_sftp_channel=Unable to open sftp channel: check sftp is enabled on remote host
@ -37,19 +33,3 @@ JschFileStore_Is_a_directory={0} is a directory
JschFileStore_No_remote_services_found_for_URI=No remote services found for URI: "{0}" JschFileStore_No_remote_services_found_for_URI=No remote services found for URI: "{0}"
JschFileStore_The_file_of_name_already_exists=A file of name {0} already exists JschFileStore_The_file_of_name_already_exists=A file of name {0} already exists
JschFileStore_The_parent_of_directory_does_not_exist=The parent of directory {0} does not exist JschFileStore_The_parent_of_directory_does_not_exist=The parent of directory {0} does not exist
MkdirCommand_Create_directory=Create directory
PutInfoCommand_Change_permissions=Change permissions
PutInfoCommand_Set_modified_time=Set modified time
RemoteToolsFileStore_0=Could not delete file {0}
RemoteToolsFileStore_1=The parent of directory {0} does not exist
RemoteToolsFileStore_2=The directory {0} could not be created
RemoteToolsFileStore_3={0} is a directory
RemoteToolsFileStore_4=Could not get input stream for {0}
RemoteToolsFileStore_5=Service failed to initialize
RemoteToolsFileStore_6=Could not open output stream
RemoteToolsFileStore_7=Invalid URI format
RemoteToolsFileStore_8=Invalid connection name: {0}
RemoteToolsFileStore_10=Unable to open connection: {0}
RemoteToolsFileStore_12=Operation was cancelled by user
RemoteToolsFileStore_13=A file of name {0} already exists
RemoteToolsFileStore_14=File doesn't exist: {0}