| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/org/documents/epl-v10.php |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.ide.eclipse.ndk.internal.launch; |
| |
| import com.android.ide.eclipse.adt.AdtPlugin; |
| import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchController; |
| import com.android.ide.eclipse.adt.internal.sdk.ProjectState; |
| import com.android.ide.eclipse.adt.internal.sdk.Sdk; |
| import com.android.ide.eclipse.ndk.internal.NdkHelper; |
| |
| import org.eclipse.cdt.core.model.CoreModel; |
| import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; |
| import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.debug.core.ILaunchConfiguration; |
| import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; |
| import org.eclipse.debug.ui.DebugUITools; |
| import org.eclipse.debug.ui.ILaunchShortcut; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.ui.IEditorPart; |
| |
| @SuppressWarnings("restriction") // for adt.internal classes |
| public class NdkGdbLaunchShortcut implements ILaunchShortcut { |
| @Override |
| public void launch(ISelection selection, String mode) { |
| if (!(selection instanceof IStructuredSelection)) { |
| return; |
| } |
| |
| Object s = ((IStructuredSelection) selection).getFirstElement(); |
| if (!(s instanceof IAdaptable)) { |
| return; |
| } |
| |
| IResource r = (IResource) ((IAdaptable) s).getAdapter(IResource.class); |
| if (r == null) { |
| return; |
| } |
| |
| IProject project = r.getProject(); |
| if (project == null) { |
| return; |
| } |
| |
| // verify that this is a non library Android project |
| ProjectState state = Sdk.getProjectState(project); |
| if (state == null || state.isLibrary()) { |
| return; |
| } |
| |
| // verify that this project has C/C++ nature |
| if (!CoreModel.hasCCNature(project) && !CoreModel.hasCNature(project)) { |
| AdtPlugin.printErrorToConsole(project, |
| String.format("Selected project (%s) does not have C/C++ nature. " |
| + "To add native support, right click on the project, " |
| + "Android Tools -> Add Native Support", |
| project.getName())); |
| return; |
| } |
| |
| debugProject(project, mode); |
| } |
| |
| @Override |
| public void launch(IEditorPart editor, String mode) { |
| } |
| |
| private void debugProject(IProject project, String mode) { |
| // obtain existing native debug config for project |
| ILaunchConfiguration config = AndroidLaunchController.getLaunchConfig(project, |
| NdkGdbLaunchDelegate.LAUNCH_TYPE_ID); |
| if (config == null) { |
| return; |
| } |
| |
| // Set the ndk gdb specific launch attributes in the config (if necessary) |
| if (!hasNdkAttributes(config)) { |
| try { |
| config = setNdkDefaults(config, project); |
| } catch (CoreException e) { |
| AdtPlugin.printErrorToConsole(project, |
| "Unable to create launch configuration for project."); |
| return; |
| } |
| } |
| |
| // launch |
| DebugUITools.launch(config, mode); |
| } |
| |
| private boolean hasNdkAttributes(ILaunchConfiguration config) { |
| try { |
| // All NDK launch configurations have ATTR_REMOTE_TCP set to true |
| boolean isRemote = config.getAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP, |
| false); |
| return isRemote; |
| } catch (CoreException e) { |
| return false; |
| } |
| } |
| |
| private ILaunchConfiguration setNdkDefaults(ILaunchConfiguration config, IProject project) |
| throws CoreException { |
| ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy(); |
| NdkHelper.setLaunchConfigDefaults(wc); |
| wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, project.getName()); |
| return wc.doSave(); |
| } |
| } |