trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/api/DecodeHandler.java
changeset 11 5b9d4d8641ce
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/api/DecodeHandler.java	Wed Jun 23 14:49:59 2010 +0300
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2007-2010 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:
+ *
+ * Decode handler handles stuff related to decode files
+ *
+ */
+package com.nokia.traceviewer.api;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import com.nokia.traceviewer.action.OpenDecodeFileAction;
+import com.nokia.traceviewer.api.TraceViewerAPI.TVAPIError;
+import com.nokia.traceviewer.engine.TraceViewerGlobals;
+import com.nokia.traceviewer.engine.TraceViewerUtils;
+import com.nokia.traceviewer.engine.activation.TraceActivationComponentItem;
+
+/**
+ * Decode handler handles stuff related to decode files
+ * 
+ */
+final class DecodeHandler {
+
+	/**
+	 * Model valid waiting time
+	 */
+	private static final long MODEL_VALID_WAITING_TIME = 100;
+
+	/**
+	 * Model valid maximum waiting time
+	 */
+	private static final long MODEL_VALID_MAX_WAITING_TIME = 5000;
+
+	/**
+	 * Decode file not loaded error code
+	 */
+	private static final int DECODE_FILE_NOT_LOADED = -2;
+
+	/**
+	 * Gets trace component name from the Decode model with a component id
+	 * 
+	 * @param componentId
+	 *            component ID
+	 * @return component name or null if not found or no Decode files are loaded
+	 */
+	public String getTraceComponentName(int componentId) {
+		String componentName = null;
+
+		if (TraceViewerGlobals.getDecodeProvider() != null) {
+			if (TraceViewerGlobals.getDecodeProvider().isModelLoadedAndValid()) {
+
+				// Returns null if the component is not found
+				componentName = TraceViewerGlobals.getDecodeProvider()
+						.getComponentName(componentId);
+			}
+		}
+
+		return componentName;
+	}
+
+	/**
+	 * Gets trace group ID with a group name
+	 * 
+	 * @param componentId
+	 *            the component ID
+	 * @param groupName
+	 *            the group name
+	 * @return trace group ID or -1 if group ID not found or -2 if no Decode
+	 *         files are loaded
+	 */
+	public int getTraceGroupId(int componentId, String groupName) {
+		int groupId = DECODE_FILE_NOT_LOADED;
+
+		if (TraceViewerGlobals.getDecodeProvider() != null) {
+			if (TraceViewerGlobals.getDecodeProvider().isModelLoadedAndValid()) {
+
+				// Returns -1 if the group is not found
+				groupId = TraceViewerGlobals.getDecodeProvider().getGroupId(
+						componentId, groupName);
+			}
+		}
+
+		return groupId;
+	}
+
+	/**
+	 * Gets trace group name from the Decode model with a component and group
+	 * ids
+	 * 
+	 * @param componentId
+	 *            component ID
+	 * @param groupId
+	 *            group ID
+	 * @return group name or null if not found or no Decode files are loaded
+	 */
+	public String getTraceGroupName(int componentId, int groupId) {
+		String groupName = null;
+
+		if (TraceViewerGlobals.getDecodeProvider() != null) {
+			if (TraceViewerGlobals.getDecodeProvider().isModelLoadedAndValid()) {
+
+				// Returns null if the component is not found
+				groupName = TraceViewerGlobals.getDecodeProvider()
+						.getGroupName(componentId, groupId);
+			}
+		}
+
+		return groupName;
+	}
+
+	/**
+	 * Gets trace name from the Decode model with a component, group and trace
+	 * IDs
+	 * 
+	 * @param componentId
+	 *            component ID
+	 * @param groupId
+	 *            group ID
+	 * @param traceId
+	 *            trace ID
+	 * @return trace name or null if not found or no Decode files are loaded
+	 */
+	public String getTraceName(int componentId, int groupId, int traceId) {
+		String traceName = null;
+
+		if (TraceViewerGlobals.getDecodeProvider() != null) {
+			if (TraceViewerGlobals.getDecodeProvider().isModelLoadedAndValid()) {
+
+				// Returns null if the component is not found
+				traceName = TraceViewerGlobals.getDecodeProvider()
+						.getTraceName(componentId, groupId, traceId);
+			}
+		}
+
+		return traceName;
+	}
+
+	/**
+	 * Loads decode file to the decode model. User must remember that loading
+	 * the decode file can take some time and this function will block until the
+	 * model is loaded or a maximum of 5 seconds.
+	 * 
+	 * @param decodeFilePath
+	 *            absolute path to the decode file. Path must be in correct
+	 *            format for any operating system (Windows, Linux)
+	 * @param deleteExistingModel
+	 *            if true, old decode model is removed before this decode file
+	 *            is loaded
+	 * @return error code from TraceViewerAPI
+	 */
+	public TVAPIError loadDecodeFile(String decodeFilePath,
+			boolean deleteExistingModel) {
+		TVAPIError errorCode = TVAPIError.DECODE_PROVIDER_PLUGIN_MISSING;
+
+		if (TraceViewerGlobals.getDecodeProvider() != null) {
+			errorCode = TVAPIError.NONE;
+			File file = new File(decodeFilePath);
+
+			// Check that file exists
+			if (file.exists()) {
+
+				// TraceViewer view is visible, use it
+				if (TraceViewerGlobals.getTraceViewer().getView() != null
+						&& !TraceViewerGlobals.getTraceViewer().getView()
+								.isDisposed()) {
+
+					OpenDecodeFileAction action = (OpenDecodeFileAction) TraceViewerGlobals
+							.getTraceViewer().getView().getActionFactory()
+							.getOpenDecodeFileAction();
+					action.loadFilesToModel(new String[] { decodeFilePath },
+							deleteExistingModel);
+
+					// No TraceViewer view available, use API
+				} else {
+					// Open the decode file
+					TraceViewerGlobals.getDecodeProvider().openDecodeFile(
+							decodeFilePath, null, deleteExistingModel);
+
+					// Wait until model is ready and loaded or maximum of five
+					// seconds
+					long startTime = System.currentTimeMillis();
+					while (!TraceViewerGlobals.getDecodeProvider()
+							.isModelLoadedAndValid()
+							&& startTime + MODEL_VALID_MAX_WAITING_TIME > System
+									.currentTimeMillis()) {
+						try {
+							Thread.sleep(MODEL_VALID_WAITING_TIME);
+						} catch (InterruptedException e) {
+						}
+					}
+
+					// Refresh the view
+					refreshViewAfterDecodeFileLoad();
+				}
+
+				// File doesn't exist
+			} else {
+				errorCode = TVAPIError.FILE_DOES_NOT_EXIST;
+			}
+		}
+
+		return errorCode;
+	}
+
+	/**
+	 * Refresh the view after Decode file has been loaded
+	 */
+	private void refreshViewAfterDecodeFileLoad() {
+
+		// Refresh the view
+		if (TraceViewerGlobals.getTraceViewer().getView() != null) {
+
+			// Check if reading from the start is needed
+			if (TraceViewerUtils.isReadingFromStartNeeded()) {
+				TraceViewerGlobals.getTraceViewer().readDataFileFromBeginning();
+
+				// Refresh the current view
+			} else {
+				TraceViewerGlobals.getTraceViewer().getView()
+						.refreshCurrentView();
+			}
+		}
+	}
+
+	/**
+	 * Gets components from all loaded Dictionaries
+	 * 
+	 * @return list of components from all loaded Dictionaries. List can be
+	 *         empty.
+	 */
+	public ArrayList<TraceActivationComponentItem> getDictionaryComponents() {
+		ArrayList<TraceActivationComponentItem> components = new ArrayList<TraceActivationComponentItem>();
+
+		if (TraceViewerGlobals.getDecodeProvider() != null) {
+			components = TraceViewerGlobals.getDecodeProvider()
+					.getActivationInformation(true);
+		}
+
+		return components;
+	}
+}