package org.ovirt.engine.ui.webadmin.uicommon; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.compat.Event; import org.ovirt.engine.core.compat.EventArgs; import org.ovirt.engine.core.compat.EventDefinition; import org.ovirt.engine.core.compat.IEventListener; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.INewAsyncCallback; import org.ovirt.engine.ui.uicommonweb.Configurator; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.vms.ISpice; import com.google.gwt.core.client.GWT; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; public class WebAdminConfigurator extends Configurator implements IEventListener { // Temporarily save the locations of webadmin and userportal. // TODO: create a new SPICE RPM for webadmin private static final String WEBADMIN_ROOT_FOLDER = "/webadmin/webadmin/"; private static final String USERPORTAL_ROOT_FOLDER = "/UserPortal/org.ovirt.engine.ui.userportal.UserPortal/"; public EventDefinition spiceVersionFileFetchedEvent_Definition = new EventDefinition("spiceVersionFileFetched", WebAdminConfigurator.class); public Event spiceVersionFileFetchedEvent = new Event(spiceVersionFileFetchedEvent_Definition); private boolean isInitialized; public WebAdminConfigurator() { // Set default configuration values setIsAdmin(true); setSpiceAdminConsole(true); setSpiceFullScreen(false); // Add event listeners spiceVersionFileFetchedEvent.addListener(this); // Update Spice version if needed updateSpiceVersion(); } private void updateSpiceVersion() { // Update spice version from the text files which are located on the server. // If can't update spice version - leave the default value from the Configurator. ClientAgentType cat = new ClientAgentType(); if ((cat.os.equalsIgnoreCase("Windows")) && (cat.browser.equalsIgnoreCase("Explorer"))) { if (cat.getPlatform().equalsIgnoreCase("win32")) { updateSpice32Version(); } else if (cat.getPlatform().equalsIgnoreCase("win64")) { updateSpice64Version(); } } } public void updateSpice32Version() { fetchFile("SpiceVersion.txt", spiceVersionFileFetchedEvent); } public void updateSpice64Version() { fetchFile("SpiceVersion_x64.txt", spiceVersionFileFetchedEvent); } public void updateIsUsbEnabled(final ISpice spice) { // Get 'EnableUSBAsDefault' value from database AsyncDataProvider.IsUSBEnabledByDefault(new AsyncQuery(this, new INewAsyncCallback() { @Override public void OnSuccess(Object target, Object returnValue) { // Update IsUsbEnabled value setIsUsbEnabled((Boolean) returnValue); } })); } public static String getSpiceBaseURL() { return GWT.getModuleBaseURL().replace(WEBADMIN_ROOT_FOLDER, USERPORTAL_ROOT_FOLDER); } // Fetch file from a specified path public void fetchFile(String filePath, final Event onFetched) { RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, getSpiceBaseURL() + filePath); try { requestBuilder.sendRequest(null, new RequestCallback() { @Override public void onError(Request request, Throwable exception) { } @Override public void onResponseReceived(Request request, Response response) { String result = response.getText(); onFetched.raise(this, new FileFetchEventArgs(result)); } }); } catch (RequestException e) { } } // Create a Version object from string public Version parseVersion(String versionStr) { return new Version(versionStr.replace(',', '.').replace("\n", "")); } @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (ev.equals(spiceVersionFileFetchedEvent_Definition)) { Version spiceVersion = parseVersion(((FileFetchEventArgs) args).getFileContent()); setSpiceVersion(spiceVersion); } } public final class FileFetchEventArgs extends EventArgs { private String fileContent; public String getFileContent() { return fileContent; } public void setFileContent(String fileContent) { this.fileContent = fileContent; } public FileFetchEventArgs(String fileContent) { setFileContent(fileContent); } } // Check whether the specified displayType is currently supported @Override public boolean IsDisplayTypeSupported(DisplayType displayType) { switch (displayType) { case vnc: return false; case qxl: ClientAgentType cat = new ClientAgentType(); return (cat.os.equalsIgnoreCase("Windows") && cat.browser.equalsIgnoreCase("Explorer")) || (cat.os.equalsIgnoreCase("Linux") && cat.browser.equalsIgnoreCase("Firefox")); } return false; } @Override public void Configure(ISpice spiceImpl) { SpiceInterfaceImpl spice = (SpiceInterfaceImpl) spiceImpl; spice.setDesiredVersion(getSpiceVersion()); spice.setCurrentVersion(getSpiceVersion()); spice.setAdminConsole(getSpiceAdminConsole()); spice.setFullScreen(getSpiceFullScreen()); if (!isInitialized) { updateIsUsbEnabled(spice); isInitialized = true; } } }