crashanalysis/crashanalyser/com.nokia.s60tools.crashanalyser/src/com/nokia/s60tools/crashanalyser/ui/wizards/CrashAnalyserWizard.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crashanalysis/crashanalyser/com.nokia.s60tools.crashanalyser/src/com/nokia/s60tools/crashanalyser/ui/wizards/CrashAnalyserWizard.java Thu Feb 11 15:06:45 2010 +0200
@@ -0,0 +1,348 @@
+/*
+* Copyright (c) 2008 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.crashanalyser.ui.wizards;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbench;
+import com.nokia.s60tools.ui.wizards.S60ToolsWizard;
+import com.nokia.s60tools.crashanalyser.model.*;
+import com.nokia.s60tools.crashanalyser.plugin.CrashAnalyserPlugin;
+import com.nokia.s60tools.crashanalyser.resources.*;
+import com.nokia.s60tools.crashanalyser.ui.views.*;
+import com.nokia.s60tools.crashanalyser.data.*;
+import com.nokia.s60tools.crashanalyser.export.ICrashFileProvider;
+
+import java.util.*;
+
+/**
+ * Crash Analyser Wizard is used for collecting required data from user so that CrashAnalyser.exe
+ * can be executed.
+ *
+ */
+public class CrashAnalyserWizard extends S60ToolsWizard {
+
+ static private final ImageDescriptor bannerImgDescriptor = ImageResourceManager.getImageDescriptor(ImageKeys.WIZARD_BANNER);
+ List<CrashFileBundle> filesToDecode = null;
+ IWizardPage returnPage = null;
+ ErrorLibrary errorLibrary;
+ FileOrPathSelectionPage crashFileOrFolderSelectionPage = null;
+ FilesSelectionPage filesSelectionPage = null;
+ ParameterFilesPage parameterFilesPage = null;
+ DecoderEngine engine;
+ String userProvidedCrashFileOrFolder;
+ boolean crashAnalyserExeExecutionSuccess = false;
+ boolean readCrashFileFromDevice = false;
+ String providedFileOrFolder = "";
+ String errorMessage = "";
+ String[] filesToBeSelectedOnSecondPage = null;
+ final String EXTENSION_FILE_PROVIDER = "fileprovider"; //$NON-NLS-1$
+ ICrashFileProvider fileProvider = null;
+ /**
+ * Constructor
+ * @param filesToBeDecoded list of files to be decoded. If null is passed, wizard will start from the beginning.
+ * If list contains files, then wizard is started from the 3rd page
+ * @param library error library
+ */
+ public CrashAnalyserWizard(List<CrashFileBundle> filesToBeDecoded, ErrorLibrary library) {
+ super(bannerImgDescriptor);
+ engine = new DecoderEngine();
+ filesToDecode = filesToBeDecoded;
+ errorLibrary = library;
+ readFileProvider();
+ }
+
+ /**
+ * Constructor (used in drag&drop cases)
+ * @param prefilledFileOrFolder single file or folder which is filled to 1st wizard page
+ * @param filesToSelect only these files should be shown in 2nd wizard page
+ * @param library error library
+ */
+ public CrashAnalyserWizard(String prefilledFileOrFolder, String[] filesToSelect, ErrorLibrary library) {
+ super(bannerImgDescriptor);
+ engine = new DecoderEngine();
+ filesToDecode = null;
+ errorLibrary = library;
+ providedFileOrFolder = prefilledFileOrFolder;
+ filesToBeSelectedOnSecondPage = filesToSelect;
+ readFileProvider();
+ }
+
+ public void init(IWorkbench arg0, IStructuredSelection arg1) {
+ // No implementation needed
+ }
+
+
+ @Override
+ public boolean needsProgressMonitor() {
+ return true;
+ }
+
+ @Override
+ public void addPages() {
+ // we are doing a full import, add all pages
+ if (filesToDecode == null) {
+ crashFileOrFolderSelectionPage =
+ new FileOrPathSelectionPage(engine,
+ errorLibrary,
+ providedFileOrFolder,
+ this,
+ fileProvider);
+ addPage(crashFileOrFolderSelectionPage);
+
+ filesSelectionPage = new FilesSelectionPage(engine, filesToBeSelectedOnSecondPage);
+ addPage(filesSelectionPage);
+
+ parameterFilesPage = new ParameterFilesPage(engine, false);
+ addPage(parameterFilesPage);
+
+ setWindowTitle("Crash Analyser - Crash File Import Wizard");
+
+ // files were drag&dropped, "press next automatically"
+ if (!"".equals(providedFileOrFolder))
+ moveToSecondPage();
+
+ // we are re-decoding files provided by user, show only "3rd" page
+ } else {
+ parameterFilesPage = new ParameterFilesPage(engine, true);
+ addPage(parameterFilesPage);
+
+ engine.setCrashFiles(filesToDecode);
+
+ setWindowTitle("Crash Analyser - Re-Decoding Selected Files");
+ }
+ }
+
+ public void moveToSecondPageRequest(String[] showOnlyTheseFiles) {
+ filesSelectionPage.showOnlyTheseFiles(showOnlyTheseFiles);
+ moveToSecondPage();
+ }
+
+ public void moveToSecondPageRequest(boolean readFilesFromDevice) {
+ readCrashFileFromDevice = readFilesFromDevice;
+ moveToSecondPage();
+ }
+
+ /**
+ * When user has drag&dropped files, we "automatically press next"
+ * in the first wizard page.
+ */
+ void moveToSecondPage() {
+ Runnable showWizardRunnable = new Runnable(){
+ public void run(){
+ IWizardPage nextPage = getNextPage(crashFileOrFolderSelectionPage);
+ if (nextPage != null)
+ getContainer().showPage(nextPage);
+ }
+ };
+
+ Display.getDefault().asyncExec(showWizardRunnable);
+ }
+
+
+ @Override
+ public boolean performFinish() {
+ boolean fullImport = crashFileOrFolderSelectionPage != null;
+
+ // full import is the case when wizard is started from page 1
+ if (fullImport) {
+ // if Finish was pressed in 2nd wizard page, symbol page (3rd page) was not used
+ // false here would mean that only "decoded" files (.crashxml) files were selected.
+ boolean symbolPageWasUsed = this.getContainer().getCurrentPage() != filesSelectionPage;
+
+ DecodingData decodingData = new DecodingData();
+ decodingData.importingFiles = true;
+
+ // save 1st page
+ crashFileOrFolderSelectionPage.saveUserEnteredData();
+
+ decodingData.crashFileIndexes = filesSelectionPage.getFileIndexes();
+
+ if (symbolPageWasUsed) {
+ // save 3rd page
+ parameterFilesPage.saveUserEnteredData();
+ decodingData.symbolFiles = parameterFilesPage.getSymbolFiles();
+ decodingData.mapFilesFolder = parameterFilesPage.getMapFilesFolder();
+ decodingData.mapFilesZip = parameterFilesPage.getMapFilesZip();
+ decodingData.imageFiles = parameterFilesPage.getImageFiles();
+ }
+
+ decodingData.errorLibrary = errorLibrary;
+
+ engine.setDecodingData(decodingData);
+
+ // not full import is the case when files are Re-Decoded via MainView
+ } else {
+ DecodingData decodingData = new DecodingData();
+ decodingData.importingFiles = false;
+
+ // save 3rd page
+ parameterFilesPage.saveUserEnteredData();
+ decodingData.symbolFiles = parameterFilesPage.getSymbolFiles();
+ decodingData.mapFilesFolder = parameterFilesPage.getMapFilesFolder();
+ decodingData.mapFilesZip = parameterFilesPage.getMapFilesZip();
+ decodingData.imageFiles = parameterFilesPage.getImageFiles();
+
+ decodingData.errorLibrary = errorLibrary;
+
+ engine.setDecodingData(decodingData);
+ }
+
+ MainView mainView = MainView.showAndReturnYourself();
+ if (mainView != null) {
+ mainView.startDecoding(engine);
+ }
+
+ return true;
+ }
+
+ public boolean canFinish()
+ {
+ if (this.getContainer().getCurrentPage() == filesSelectionPage) {
+ return filesSelectionPage.canFinish();
+ } else if (this.getContainer().getCurrentPage() == parameterFilesPage) {
+ return parameterFilesPage.canFinish();
+ } else {
+ return false;
+ }
+ }
+
+ public IWizardPage getNextPage(IWizardPage page) {
+ // We are moving from 1st page to 2nd page.
+ // We need to run CrashAnalyser.exe to get summary data for crash files
+ if(page.equals(crashFileOrFolderSelectionPage)){
+ returnPage = null;
+ userProvidedCrashFileOrFolder = crashFileOrFolderSelectionPage.getSelectedFileOrFolder();
+ crashAnalyserExeExecutionSuccess = false;
+ try {
+ getContainer().run(true, false, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) {
+ errorMessage = "";
+ // run CrashAnalyser.exe for summary information for selected file(s).
+ if (readCrashFileFromDevice && fileProvider != null) {
+ errorMessage = fileProvider.executeFunctionality(DecoderEngine.getTemporaryCrashFileFolder(true));
+ userProvidedCrashFileOrFolder = DecoderEngine.getTemporaryCrashFileFolder(false);
+ }
+ crashAnalyserExeExecutionSuccess =
+ engine.processSummaryInfoForFiles(userProvidedCrashFileOrFolder, errorLibrary, monitor);
+ }
+ }
+ );
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ // CrashAnalyser.exe execution was successful -> return next wizard page
+ if (crashAnalyserExeExecutionSuccess) {
+ crashFileOrFolderSelectionPage.errorInProcessingNextPress(false);
+ filesSelectionPage.loadTable();
+ returnPage = filesSelectionPage;
+ // CrashAnalyser.exe execution was unsuccessful, don't proceed to next
+ // wizard page -> return current page
+ } else {
+ if (readCrashFileFromDevice) {
+ if ("".equals(errorMessage)) {
+ showMessage("The device did not contain any crash files");
+ } else {
+ showMessage("Could not read crash files. Please check PC Suite connection.\n\nError:\n" + errorMessage);
+ }
+ } else {
+ crashFileOrFolderSelectionPage.errorInProcessingNextPress(true);
+ }
+ returnPage = crashFileOrFolderSelectionPage;
+ filesSelectionPage.showOnlyTheseFiles(null);
+ }
+
+ readCrashFileFromDevice = false;
+
+ return returnPage;
+ }
+ // We are moving from 2nd page to 3rd/4th page.
+ else if (page.equals(filesSelectionPage)) {
+ // only (already "decoded") output.crashxml files have been selected in 2nd page.
+ // Skip parameterFiles page and go to additionalSettingsPage, because we don't have
+ // to query for symbols etc. because there is nothing to decode.
+ return parameterFilesPage;
+ }
+
+ return null;
+ }
+
+ /**
+ * Shows a message box with given message
+ * @param message
+ */
+ private void showMessage(String message) {
+ MessageDialog.openInformation(
+ getShell(),
+ "Crash Analyser",
+ message);
+ }
+
+ @Override
+ public boolean performCancel() {
+ DecoderEngine.getTemporaryCrashFileFolder(true);
+ return super.performCancel();
+ }
+
+ /**
+ * Tries to find plugins which are File Providers. Selectes the first found
+ * File provider plugin.
+ */
+ void readFileProvider() {
+ try {
+ IExtensionRegistry er = Platform.getExtensionRegistry();
+ IExtensionPoint ep =
+ er.getExtensionPoint(CrashAnalyserPlugin.PLUGIN_ID, EXTENSION_FILE_PROVIDER);
+ IExtension[] extensions = ep.getExtensions();
+
+ // if plug-ins were found.
+ if (extensions != null && extensions.length > 0) {
+
+ // read all found trace providers
+ for (int i = 0; i < extensions.length; i++) {
+ IConfigurationElement[] ce = extensions[i].getConfigurationElements();
+ if (ce != null && ce.length > 0) {
+ try {
+ ICrashFileProvider provider = (ICrashFileProvider)ce[0].createExecutableExtension("class");
+ // we support only one trace provider
+ if (provider != null) {
+ fileProvider = provider;
+ break;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}