package org.ovirt.engine.ui.uicommonweb.models.vms;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.queries.ConfigurationValues;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.ui.uicommonweb.ConsoleUtils;
import org.ovirt.engine.ui.uicommonweb.TypeResolver;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.models.ConsoleProtocol;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
public class RdpConsoleModel extends ConsoleModel {
public enum ClientConsoleMode { Native, Plugin, Auto }
private IRdp privaterdp;
private ClientConsoleMode clientConsoleMode;
private boolean useFQDNIfAvailable;
private final ConsoleUtils consoleUtils;
public IRdp getrdp() {
return privaterdp;
}
public ClientConsoleMode getClientConsoleMode() {
return clientConsoleMode;
}
public void setRdpImplementation(ClientConsoleMode consoleMode) {
this.clientConsoleMode = consoleMode;
switch (consoleMode) {
case Native:
setrdp((IRdp) TypeResolver.getInstance().resolve(IRdpNative.class));
break;
case Plugin:
IRdpPlugin plugin = (IRdpPlugin) TypeResolver.getInstance().resolve(IRdpPlugin.class);
plugin.setParentModel(this);
setrdp(plugin);
break;
default:
IRdpPlugin impl = (IRdpPlugin) TypeResolver.getInstance().resolve(IRdpPlugin.class);
impl.setParentModel(this);
setrdp(consoleUtils.isBrowserPluginSupported(ConsoleProtocol.RDP) ? impl
: (IRdp) TypeResolver.getInstance().resolve(IRdpNative.class));
break;
}
}
private void setUseFqdnIfAvailable(boolean value) {
useFQDNIfAvailable = value;
}
private boolean getUseFqdnIfAvailable() {
return useFQDNIfAvailable;
}
private void setrdp(IRdp value) {
privaterdp = value;
}
public RdpConsoleModel(VM myVm, Model parentModel) {
super(myVm, parentModel);
setTitle(ConstantsManager.getInstance().getConstants().rdpTitle());
this.consoleUtils = (ConsoleUtils) TypeResolver.getInstance().resolve(ConsoleUtils.class);
setRdpImplementation(
ClientConsoleMode.valueOf((String) AsyncDataProvider.getInstance().getConfigValuePreConverted(ConfigurationValues.ClientModeRdpDefault)));
setUseFqdnIfAvailable((Boolean) AsyncDataProvider.getInstance().getConfigValuePreConverted(ConfigurationValues.UseFqdnForRdpIfAvailable));
}
@Override
protected void connect() {
if (getEntity() != null) {
getLogger().debug("Connecting to RDP console..."); //$NON-NLS-1$
boolean haveFqdn = false;
if (getUseFqdnIfAvailable()) {
getLogger().debug("RDP connection is using FQDN if available"); //$NON-NLS-1$
if (!StringHelper.isNullOrEmpty(getEntity().getFqdn())) {
getLogger().debug("RDP connection is using FQDN because it is available"); //$NON-NLS-1$
haveFqdn = true;
getrdp().setAddress(getEntity().getFqdn());
}
}
if (!haveFqdn) {
getLogger().debug("RDP connection is not using FQDN"); //$NON-NLS-1$
getrdp().setAddress(getEntity().getVmHost().split("[ ]", -1)[0]); //$NON-NLS-1$
}
getrdp().setGuestID(getEntity().getId().toString());
// Try to connect.
try {
getrdp().connect();
} catch (RuntimeException ex) {
getLogger().error("Exception on RDP connect", ex); //$NON-NLS-1$
}
}
}
@Override
public boolean canBeSelected() {
return AsyncDataProvider.getInstance().isWindowsOsType(getEntity().getOs());
}
@Override
public boolean canConnect() {
return (getEntity().getStatus() == VMStatus.Up || getEntity().getStatus() == VMStatus.PoweringDown)
&& AsyncDataProvider.getInstance().isWindowsOsType(getEntity().getVmOsId());
}
public void raiseErrorEvent(ErrorCodeEventArgs e) {
getErrorEvent().raise(this, e);
}
}