diff -r f65f740e69f9 -r 8e12a575a9b5 sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/ui/UiUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/ui/UiUtils.java Wed Apr 21 20:01:08 2010 +0300 @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +package com.nokia.s60tools.memspy.ui; + +import java.io.File; +import java.io.IOException; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.program.Program; +import org.eclipse.swt.widgets.Display; + +import com.nokia.s60tools.memspy.interfaces.IMemSpyTraceListener; +import com.nokia.s60tools.memspy.interfaces.IMemSpyTraceListener.LauncherErrorType; +import com.nokia.s60tools.memspy.model.TraceCoreEngine.ProgressStatus; +import com.nokia.s60tools.memspy.plugin.MemSpyPlugin; +import com.nokia.s60tools.memspy.util.MemSpyConsole; +import com.nokia.s60tools.util.debug.DbgUtility; + +/** + * Static UI utility methods that are needed more than one place + * are located here in order to prevent code duplication. + */ +public class UiUtils { + + + /** + * Launcher SIS file name + */ + private static final String MEM_SPY_LAUNCHER_S60_50_RN_D_SIGNED_SIS_FILE_NAME = "MemSpyLauncher_S60-50_RnD-signed.sis"; + + /** + * Shows error dialog that gives error context related information and guidance. + * E.g. Advises user to install launcher component to the device if it is needed. + * @param error Launcher error encountered + * @param errorMessage Error message to be shown to user + * @param progressStatus + */ + public static void showErrorDialogToUser(final LauncherErrorType error, final String errorMessage, final ProgressStatus progressStatus) { + + Runnable updateUiRunnable = new Runnable(){ + public void run(){ + + // If no answer from device received, display dialog that allows user to install MemSpy Launcher. + if( error == LauncherErrorType.NO_ANSWER_FROM_DEVICE || error == LauncherErrorType.TOO_OLD_MEMSPY_LAUNCHER_DATAVERSION ){ + + switch (progressStatus) { + // Flow through on purpose 1 + case EPROGRESS_MEMSPY_LAUNCHED: // MemSpy is launched but not yet actual task + case EPROGRESS_FIRST_TASK_LAUNCHED: // MemSpy is launched and also 1st real task is done + case EPROGRESS_FIRST_TASK_DONE: // Trace data has been received successfully at least once + showStandardErrorMessageDialog(errorMessage); + break; + // Flow through on purpose 2 + case EPROGRESS_INITIAL: // MemSpy has not been launched successfully, so no progress at all + default: + adviceUserToInstallLauncherComponent(errorMessage); + break; + } + } + else{ + showStandardErrorMessageDialog(errorMessage); + } + + } + + }; + + Display.getDefault().asyncExec(updateUiRunnable); + } + + /** + * Shows standard eclipse error dialog with given error message + * @param errorMessage error message + */ + private static void showStandardErrorMessageDialog(String errorMessage) { + Status status = new Status(IStatus.ERROR, MemSpyPlugin.PLUGIN_ID, 0, errorMessage, null); + // Display the dialog + ErrorDialog.openError(Display.getCurrent().getActiveShell(),IMemSpyTraceListener.ERROR_MEMSPY, null, status); + } + + /** + * Advises used to install MemSpy launcher component and provides necessary action alternatives. + * @param errorMessage error message + */ + private static void adviceUserToInstallLauncherComponent(final String errorMessage) { + + MessageDialog dialog = new MessageDialog( Display.getCurrent().getActiveShell(), + IMemSpyTraceListener.ERROR_MEMSPY, null, errorMessage, MessageDialog.ERROR, + new String[]{ "Install RnD-signed MemSpy Launcher", "Open sis-file's directory in Explorer", "Don't install" }, 1); + dialog.open(); + + String launcherFolder = MemSpyPlugin.getDefault().getMemspyLauncherBinDir(); + String launcherLocation = launcherFolder + File.separatorChar + MEM_SPY_LAUNCHER_S60_50_RN_D_SIGNED_SIS_FILE_NAME; + + // if user wants to install launcher: + if( dialog.getReturnCode() == 0 ){ + // find program for xls-filetype + Program p=Program.findProgram(".sis"); + // if found, launch it. + if(p!=null){ + // Check that found program was Nokia PC Suite. + p.execute( launcherLocation ); + } + else{ + Status status = new Status(IStatus.ERROR, MemSpyPlugin.PLUGIN_ID, 0, + "Unable to locate PC suite or other suitable software for installing .sis -file from computer. You can try installing MemSpy launcher manually from:\n" + + launcherLocation, null); + ErrorDialog.openError(Display.getCurrent().getActiveShell(),"MemSpy Error", null, status); + } + + } + + // Open directory in explorer + else if( dialog.getReturnCode() == 1 ){ + try { + String directory = Platform.getConfigurationLocation().getURL().getFile(); + directory = directory.substring(1); + Runtime.getRuntime().exec("explorer " + launcherFolder); + } catch (IOException e) { + Status status = new Status(IStatus.ERROR, MemSpyPlugin.PLUGIN_ID, 0, "Unable to open Explorer", null); + ErrorDialog.openError(Display.getCurrent().getActiveShell(),IMemSpyTraceListener.ERROR_MEMSPY, null, status); + e.printStackTrace(); + } + } + + } + + /** + * Maps given launcher error to corresponding error message. + * @param error error enumerator + * @param clientContextString client context string for giving usage context info. Used only for possible console logging. + * @param progressStatus current progress status for giving extra information on the possible error condition. + * @return error message string + */ + public static String getErrorMessageForLauncherError(LauncherErrorType error, String clientContextString, ProgressStatus progressStatus) { + + String errorMessage; + + DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "getErrorMessageForLauncherError/progressStatus: " + progressStatus); //$NON-NLS-1$ + + switch (error){ + case NO_ANSWER_FROM_DEVICE:{ + errorMessage = getErrorDescriptionForNoAnswerFromDeviceError(progressStatus, clientContextString); + break; + } + case MEMSPY_NOT_RUNNING:{ + errorMessage = IMemSpyTraceListener.ERROR_MEMSPY_NOT_RUNNING; + break; + } + case MEMSPY_NOT_FOUND:{ + errorMessage = IMemSpyTraceListener.ERROR_MEMSPY_NOT_FOUND; + break; + } + case ACTIVATION:{ + errorMessage = IMemSpyTraceListener.ERROR_ACTIVATION_NOT_SUCCESFUL; + break; + } + case FILE:{ + errorMessage = IMemSpyTraceListener.ERROR_FILE_OPERATIONS_NOT_SUCCESSFUL; + break; + } + case TOO_OLD_MEMSPY_LAUNCHER_DATAVERSION:{ + errorMessage = IMemSpyTraceListener.ERROR_TOO_OLD_MEMSPY_LAUNCHER_VERSION; + break; + } + case DUMPED_TRACES:{ + errorMessage = IMemSpyTraceListener.ERROR_DUMPED_TRACES; + break; + } + case CATEGORIES_NOT_SUPPORTED:{ + errorMessage = IMemSpyTraceListener.ERROR_CATEGORIES_NOT_SUPPORTED; + break; + } + case GENERAL_LAUNCHER_ERROR:{ + errorMessage = IMemSpyTraceListener.ERROR_GENERAL_LAUNCHER_ERROR; + break; + } + // default handling in case new launcher error has been added but not handled appropriately + default:{ + MemSpyConsole.getInstance().println(clientContextString + " error: '" //$NON-NLS-1$ + + error.name() + "' occurrence." //$NON-NLS-1$ + , MemSpyConsole.MSG_ERROR); //$NON-NLS-1$ + errorMessage = IMemSpyTraceListener.ERROR_ACTIVATION_NOT_SUCCESFUL; + break; + } + } + + return errorMessage; + } + + /** + * Forms error description in no answer from device error situation. + * @param progressStatus progress status at the moment when error occurred. + * @param clientContextString Possibly more context-specific information + * @return + */ + private static String getErrorDescriptionForNoAnswerFromDeviceError(ProgressStatus progressStatus, String clientContextString) { + + // Default message start portion + String errorMessage = IMemSpyTraceListener.ERROR_NO_RESPONSE + " " + IMemSpyTraceListener.ERROR_POSSIBLE_REASONS; + + switch (progressStatus) { + + // Flow through on purpose 1 + case EPROGRESS_MEMSPY_LAUNCHED: // MemSpy is launched but not yet actual task + case EPROGRESS_FIRST_TASK_DONE: // Trace data has been received successfully at least once + case EPROGRESS_FIRST_TASK_LAUNCHED: // MemSpy is launched and also 1st real task is done + // add USB error note. + errorMessage = errorMessage + IMemSpyTraceListener.ERROR_USB_TRACE_ENABLED; + // add check for connection information message + errorMessage = errorMessage + IMemSpyTraceListener.ERROR_CONNECTION_BROKEN; + break; + + // Flow through on purpose 2 + case EPROGRESS_INITIAL: // MemSpy has not been launched successfully, so no progress at all + default: + errorMessage = IMemSpyTraceListener.ERROR_NO_RESPONSE + " " + IMemSpyTraceListener.ERROR_POSSIBLE_REASONS; + // add USB error note. + errorMessage = errorMessage + IMemSpyTraceListener.ERROR_USB_TRACE_ENABLED; + // add install note for MemSpy Launcher + errorMessage = errorMessage + IMemSpyTraceListener.ERROR_INSTALL_MEMSPY_LAUNCHER; + break; + } + + if(clientContextString.length() > 0){ + MemSpyConsole.getInstance().println(IMemSpyTraceListener.ERROR_NO_RESPONSE + + IMemSpyTraceListener.ERROR_LAUNCHER_ERROR_DETAILS + clientContextString //$NON-NLS-1$ + , MemSpyConsole.MSG_ERROR); + errorMessage = errorMessage + IMemSpyTraceListener.ERROR_SEE_CONSOLE_LOG; + } + + return errorMessage; + } + +}