package org.ovirt.engine.ui.userportal.client.uicommonext; 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.uicommon.Configurator; import org.ovirt.engine.ui.uicommon.DataProvider; import org.ovirt.engine.ui.uicommon.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommon.models.vms.ISpice; import org.ovirt.engine.ui.userportal.client.Masthead; import org.ovirt.engine.ui.userportal.client.common.UserPortalMode; import org.ovirt.engine.ui.userportal.client.util.ClientAgentType; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.Response; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; public class UserPortalConfigurator extends Configurator implements IEventListener { private static UserPortalConfigurator instance = null; public EventDefinition spiceVersionFileFetchedEvent_Definition = new EventDefinition("spiceVersionFileFetched", UserPortalConfigurator.class); public Event spiceVersionFileFetchedEvent = new Event(spiceVersionFileFetchedEvent_Definition); public EventDefinition usbFilterFileFetchedEvent_Definition = new EventDefinition("usbFilterFileFetched", UserPortalConfigurator.class); public Event usbFilterFileFetchedEvent = new Event(usbFilterFileFetchedEvent_Definition); private final String DEFAULT_USB_FILTER = "-1,-1,-1,-1,0"; private String usbFilter = DEFAULT_USB_FILTER; private boolean isInitialized; private UserPortalConfigurator() { // Add event listeners spiceVersionFileFetchedEvent.addListener(this); usbFilterFileFetchedEvent.addListener(this); // Update spice version from the text files which are located on the server. // If can't update spice version - leave the default value from 'Configurator'. ClientAgentType cat = new ClientAgentType(); if (cat.getPlatform().equalsIgnoreCase("win32")) { updateSpiceVersion(); } else if (cat.getPlatform().equalsIgnoreCase("win64")) { updateSpice64Version(); } // Update USB filters updateUsbFilter(); } public static UserPortalConfigurator getInstance() { if (instance == null) { instance = new UserPortalConfigurator(); } return instance; } protected void setUsbFilter(String usbFilter) { this.usbFilter = usbFilter; } public String getUsbFilter() { return usbFilter; } public void updateSpiceVersion() { fetchFile("SpiceVersion.txt", spiceVersionFileFetchedEvent); } public void updateSpice64Version() { fetchFile("SpiceVersion_x64.txt", spiceVersionFileFetchedEvent); } public void updateUsbFilter() { fetchFile("consoles/spice/usbfilter.txt", usbFilterFileFetchedEvent); } 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); } })); } // Fetch file from a specified path public void fetchFile(String filePath, final Event onFetched) { RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, filePath); try { requestBuilder.sendRequest(null, new RequestCallback() { public void onError(Request request, Throwable exception) { } 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); } else if (ev.equals(usbFilterFileFetchedEvent_Definition)) { String usbFilter = ((FileFetchEventArgs)args).getFileContent(); setUsbFilter(usbFilter); } } 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); } } @Override public boolean getSpiceFullScreen() { return Masthead.getInstance().getUserPortalMode() == UserPortalMode.BASIC; } @Override public void Configure(ISpice spice) { spice.setDesiredVersion(getSpiceVersion()); spice.setAdminConsole(getSpiceAdminConsole()); spice.setFullScreen(getSpiceFullScreen()); spice.setUsbFilter(usbFilter); if (!isInitialized) { updateIsUsbEnabled(spice); isInitialized = true; } } }