blob: 3f33600364356372dfa00c61f6b68768566f72d1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 SAP SE 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:
* SAP SE - initial version
*******************************************************************************/
package org.eclipse.urischeme.internal.registration;
/**
* Used to add entries to Windows Registry. Adds handler entries for uri schemes
* like scheme and HandlerPath.Can also remove schemes.
*
*/
public class RegistryWriter implements IRegistryWriter {
private String key_software_classes;
private String key_shell;
private String key_open;
private String key_command;
private static final String ATTRIBUTE_DEFAULT = null;
private static final String ATTRIBUTE_EXECUTABLE = "Executable"; //$NON-NLS-1$
private static final String ATTRIBUTE_PROTOCOL_MARKER = "URL Protocol"; //$NON-NLS-1$
private IWinRegistry winRegistry = null;
private IFileProvider fileProvider = null;
/**
* This constructor creates all it's dependencies on it's own.
*
*/
public RegistryWriter() {
this(new WinRegistry(), new FileProvider());
}
/**
* This constructor allows providing all dependencies.
*
* @param winRegistry API to the windows registry
* @param fileProvider Encapsulates access to the file system
*
*/
public RegistryWriter(IWinRegistry winRegistry, IFileProvider fileProvider) {
this.winRegistry = winRegistry;
this.fileProvider = fileProvider;
}
@Override
public void addScheme(String scheme, String launcherPath) throws WinRegistryException {
Util.assertUriSchemeIsLegal(scheme);
// This will help to potentially avoid the following bug mentioned in the issue:
// https://stackoverflow.com/questions/5354838/java-java-util-preferences-failing#
getRegisteredHandlerPath(scheme);
winRegistry.setValueForKey(key_software_classes, ATTRIBUTE_PROTOCOL_MARKER, ""); //$NON-NLS-1$
winRegistry.setValueForKey(key_software_classes, ATTRIBUTE_DEFAULT, "URL:" + scheme); //$NON-NLS-1$
winRegistry.setValueForKey(key_command, ATTRIBUTE_EXECUTABLE, launcherPath);
String openCommand = IRegistryWriter.quote(launcherPath) + " " + IRegistryWriter.quote("%1"); //$NON-NLS-1$ //$NON-NLS-2$
winRegistry.setValueForKey(key_command, ATTRIBUTE_DEFAULT, openCommand);
}
@Override
public void removeScheme(String scheme) throws WinRegistryException {
Util.assertUriSchemeIsLegal(scheme);
if (getRegisteredHandlerPath(scheme) == null) {
return;
}
winRegistry.deleteKey(key_command);
winRegistry.deleteKey(key_open);
winRegistry.deleteKey(key_shell);
winRegistry.deleteKey(key_software_classes);
}
@Override
public String getRegisteredHandlerPath(String scheme) throws WinRegistryException {
changeKeys(scheme);
String marker = winRegistry.getValueForKey(key_software_classes, ATTRIBUTE_PROTOCOL_MARKER);
if (marker == null) {
return null;
}
String command = winRegistry.getValueForKey(key_command, ATTRIBUTE_DEFAULT);
if (command == null) {
return null;
}
String exec = winRegistry.getValueForKey(key_command, ATTRIBUTE_EXECUTABLE);
if (exec == null) {
return null;
}
if (!fileProvider.fileExists(exec)) {
return null;
}
return exec;
}
void changeKeys(String scheme) {
key_software_classes = "Software\\Classes\\"; //$NON-NLS-1$
key_software_classes += scheme;
key_shell = key_software_classes + "\\shell"; //$NON-NLS-1$
key_open = key_shell + "\\open"; //$NON-NLS-1$
key_command = key_open + "\\command"; //$NON-NLS-1$
}
}