sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/ui/UiUtils.java
/*
* 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;
}
}