diff -r f65f740e69f9 -r 8e12a575a9b5 sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/plugin/MemSpyPlugin.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysperfana/memspyext/com.nokia.s60tools.memspy/src/com/nokia/s60tools/memspy/plugin/MemSpyPlugin.java Wed Apr 21 20:01:08 2010 +0300 @@ -0,0 +1,363 @@ +/* +* 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.plugin; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import org.eclipse.core.runtime.FileLocator; +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.Platform; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; + +import com.nokia.s60tools.memspy.export.ITraceClientNotificationsIf; +import com.nokia.s60tools.memspy.export.ITraceDataProcessor; +import com.nokia.s60tools.memspy.export.ITraceProvider; +import com.nokia.s60tools.memspy.resources.ImageResourceManager; +import com.nokia.s60tools.memspy.util.MemSpyConsole; +import com.nokia.s60tools.util.debug.DbgUtility; + + +/** + * The activator class controls the plug-in life cycle. + */ +public class MemSpyPlugin extends AbstractUIPlugin { + + /** + * Plug-in ID for Launcher plug-in. + */ + public static final String MEMSPY_TRACE_PLUGIN_ID = "com.nokia.s60tools.memspy.trace";//$NON-NLS-1$ + /** + * Launcher plug-in binaries directory name. + */ + public static final String LAUNCHER_BINARIES_DIR_NAME = "Launcher.binaries";//$NON-NLS-1$ + + /** + * Trace provider extension name. + */ + final String EXTENSION_TRACE_PROVIDER = "traceprovider"; //$NON-NLS-1$ + + /** + * Plug-in ID constant. + */ + public static final String PLUGIN_ID = "com.nokia.s60tools.memspy"; + + /** + * Member for storing plug-in install path. + */ + private String pluginInstallPath = ""; + + /** + * Shared plug-in instance + */ + private static MemSpyPlugin plugin; + + /** + * Storing reference to possibly installed trace provider plug-in. + */ + private static ITraceProvider traceProvider; + + /** + * Preferences store instance reference. + */ + private static IPreferenceStore prefsStore; + + /** + * SWMT category setting feature is enabled by default, but may be disabled in case device does not support it. + */ + boolean isSWMTCategorySettingFeatureEnabled = true; + + /** + * The constructor + */ + public MemSpyPlugin() { + plugin = this; + } + + /* (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + + String pluginInstallLocation = getPluginInstallPath(); + String imagesPath = getImagesPath(pluginInstallLocation); + + // Loading images required by this plug-in + ImageResourceManager.loadImages(imagesPath); + + // Getting installed trace provider plug-in if available + traceProvider = findTraceProviderExtension(); + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static MemSpyPlugin getDefault() { + return plugin; + } + + /** + * Get plugin installation path + * @return the path where this plugin is installed + */ + public static String getPluginInstallPath() { + try { + if ( plugin.pluginInstallPath.equals("") ) { //$NON-NLS-1$ + // URL to the plugin's root ("/") + URL relativeURL = plugin.getBundle().getEntry("/"); //$NON-NLS-1$ + // Converting into local path + URL localURL = FileLocator.toFileURL(relativeURL); + // Getting install location in correct form + File f = new File(localURL.getPath()); + plugin.pluginInstallPath = f.getAbsolutePath(); + } + return plugin.pluginInstallPath; + } catch (Exception e) { + return ""; //$NON-NLS-1$ + } + } + + /** + * Gets images path relative to given plugin install path. + * @param pluginInstallPath Plugin installation path. + * @return Path were image resources are located. + * @throws IOException + */ + private String getImagesPath(String pluginInstallPath) throws IOException{ + return pluginInstallPath + + File.separatorChar + "icons"; //$NON-NLS-1$ + } + + /** + * This must be called from UI thread. If called + * from non-ui thread this returns null. + * @return Currently active workbench page. + */ + public static IWorkbenchPage getCurrentlyActivePage(){ + return getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage(); + } + + /** + * This must be called from UI thread. If called + * from non-UI thread this returns null. + * @return The shell of the currently active workbench window.. + */ + public static Shell getCurrentlyActiveWbWindowShell(){ + IWorkbenchPage page = getCurrentlyActivePage(); + if(page != null){ + return page.getWorkbenchWindow().getShell(); + } + return null; + } + + /** + * Checks if SWMT category setting feature is enabled. + * @return true if enabled, otherwise false. + */ + public boolean isSWMTCategorySettingFeatureEnabled() { + return isSWMTCategorySettingFeatureEnabled; + } + + /** + * Sets if SWMT category setting feature is enabled. + * @param isSWMTCategorySettingFeatureEnabled true if enabled, otherwise false. + */ + public void setSWMTCategorySettingFeatureEnabled( + boolean isSWMTCategorySettingFeatureEnabled) { + this.isSWMTCategorySettingFeatureEnabled = isSWMTCategorySettingFeatureEnabled; + } + + /** + * Gets MemSpy Launcher plugin's binaries directory path + * @return path were Launcher binaries are located. + */ + public String getMemspyLauncherBinDir(){ + + Bundle bundle = Platform + .getBundle(MEMSPY_TRACE_PLUGIN_ID); //$NON-NLS-1$ + + String launcherBinDir = null; + try { + // URL to the Launcher binaries + URL relativeURL = bundle.getEntry(LAUNCHER_BINARIES_DIR_NAME); //$NON-NLS-1$ + // Converting into local path + URL localURL = FileLocator.toFileURL(relativeURL); + // Getting install location in correct form + File file = new File(localURL.getPath()); + launcherBinDir = file.getAbsolutePath(); + MemSpyConsole.getInstance().println("MemSpyLauncher binaries dir detected: " +launcherBinDir); + + } catch (IOException e) { + MemSpyConsole.getInstance().println("MemSpyLauncher binaries dir detection failed, reason: " +e); + e.printStackTrace(); + } + return launcherBinDir; + + } + + /** + * Returns PreferenceStore where plugin preferences are stored. + * @return PreferenceStore where plugin preferences are stored + */ + public static IPreferenceStore getPrefsStore() { + if (prefsStore == null){ + prefsStore = getDefault().getPreferenceStore(); + } + + return prefsStore; + } + + /** + * Gets trace provider interface instance if available. + * @return trace provider interface instance or null if not available + */ + public static ITraceProvider getTraceProvider(){ + if(isTraceProviderAvailable()){ + return traceProvider; + } + // Otherwise returning a dummy provider instance + return createDummyTraceProviderInstance(); + } + + /** + * Creates a dummy trace provider instance. + * Client can safely reference to this dummy instance without any NullPointerException + * problems etc. However the corresponding functionalities from UI should be disables. + * @return dummy trace provider instance. + */ + private static ITraceProvider createDummyTraceProviderInstance() { + // Creating just a dummy provider instance that does not do anything + return new ITraceProvider() { + + public void stopListenTraceData() { + // dummy provider does not take any actions + } + + public boolean startListenTraceData(ITraceDataProcessor dataProcessor) { + // dummy provider does not take any actions + return false; + } + + public boolean sendStringData(String stringData) { + // dummy provider does not take any actions + return false; + } + + public boolean sendIntData(int integerData) { + // dummy provider does not take any actions + return false; + } + + public String getTraceSourcePreferencePageId() { + // dummy provider does not take any actions + return null; + } + + public String getDisplayNameForCurrentConnection() { + return ""; + } + + public void disconnectTraceSource() { + // dummy provider does not take any actions + } + + public boolean connectTraceSource( + ITraceClientNotificationsIf traceClient) { + // dummy provider does not take any actions + return false; + } + + public boolean activateTrace(String traceGroupID) { + // dummy provider does not take any actions + return false; + } + + }; + } + + /** + * Checks if trace provider plug-in is available. + * @return true if trace provider interface available, otherwise false + */ + public static boolean isTraceProviderAvailable(){ + return (traceProvider != null); + } + + /** + * Tries to find trace provider plug-ins. Selecting the first found one. + * @return reference to trace provider instance if found, otherwise null + */ + ITraceProvider findTraceProviderExtension() { + try { + IExtensionRegistry er = Platform.getExtensionRegistry(); + IExtensionPoint ep = er.getExtensionPoint(PLUGIN_ID, EXTENSION_TRACE_PROVIDER); + String uniqueIdentifier = ep.getUniqueIdentifier(); + DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Found extension point: " + uniqueIdentifier); //$NON-NLS-1$ + 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 { + ITraceProvider provider = (ITraceProvider)ce[0].createExecutableExtension("class"); //$NON-NLS-1$ + // We support only one trace provider + if (provider != null) { + return provider; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + +}