/******************************************************************************* * Copyright (c) 2000, 2011 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * QNX Software Systems - Initial API and implementation * Ed Swartz (Nokia) * Anton Leherbauer (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.model; import java.io.File; import java.util.ArrayList; import java.util.Map; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.CoreModelUtil; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IIncludeEntry; import org.eclipse.cdt.core.model.IIncludeReference; import org.eclipse.cdt.internal.core.util.MementoTokenizer; import org.eclipse.cdt.utils.PathUtil; import org.eclipse.cdt.utils.UNCPathConverter; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; /** * IncludeReference */ public class IncludeReference extends Openable implements IIncludeReference { final IIncludeEntry fIncludeEntry; final IPath fPath; public IncludeReference(ICProject cproject, IIncludeEntry entry) { this(cproject, entry, entry.getFullIncludePath()); } public IncludeReference(ICElement celement, IIncludeEntry entry, IPath path) { super(celement, null, path.toString(), ICElement.C_VCONTAINER); fIncludeEntry = entry; fPath = PathUtil.getCanonicalPathWindows(path); } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.ICElement#getResource() */ @Override public IResource getResource() { return null; } /* * @see org.eclipse.cdt.internal.core.model.CElement#exists() */ @Override public boolean exists() { File file = null; if (fPath != null) { file = fPath.toFile(); } else if (fIncludeEntry != null) { file = fIncludeEntry.getFullIncludePath().toFile(); } return file != null && file.isDirectory(); } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.model.CElement#createElementInfo() */ @Override protected CElementInfo createElementInfo() { return new OpenableInfo(this); } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.IIncludeReference#getIncludeEntry() */ public IIncludeEntry getIncludeEntry() { return fIncludeEntry; } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.model.Openable#buildStructure(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource) */ @Override protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map<ICElement, CElementInfo> newElements, IResource underlyingResource) throws CModelException { return computeChildren(info, pm, underlyingResource); } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.IIncludeReference#getAffectedPath() */ public IPath getAffectedPath() { return fIncludeEntry.getPath(); } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.model.CContainer#computeChildren(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.resources.IResource) */ protected boolean computeChildren(OpenableInfo info, IProgressMonitor pm, IResource res) throws CModelException { ArrayList<ICElement> vChildren = new ArrayList<ICElement>(); IPath filePath = null; if (fPath != null) { filePath = fPath; } else if (fIncludeEntry != null) { filePath = fIncludeEntry.getFullIncludePath(); } if (filePath != null) { if (!filePath.isUNC()) { File file = filePath.toFile(); String[] names = null; if (file != null && file.isDirectory()) { names = file.list(); if (names != null) { IPath path = new Path(file.getAbsolutePath()); for (String name : names) { File child = new File(file, name); ICElement celement = null; if (child.isDirectory()) { celement = new IncludeReference(this, fIncludeEntry, new Path(child.getAbsolutePath())); } else if (child.isFile()){ String id = CoreModel.getRegistedContentTypeId(getCProject().getProject(), name); if (id != null) { // TODO: should use URI celement = new ExternalTranslationUnit(this, URIUtil.toURI(path.append(name)), id); } } if (celement != null) { vChildren.add(celement); } } } } } else { try { IFileStore store = EFS.getStore(UNCPathConverter.getInstance().toURI(filePath)); IFileStore children[] = store.childStores(EFS.NONE, pm); for (IFileStore child : children) { ICElement celement = null; if (child.fetchInfo().isDirectory()) { celement = new IncludeReference(this, fIncludeEntry, filePath.append(child.getName())); } else { String id = CoreModel.getRegistedContentTypeId(getCProject().getProject(), child.getName()); if (id != null) { // TODO: should use URI celement = new ExternalTranslationUnit(this, child.toURI(), id); } } if (celement != null) { vChildren.add(celement); } } } catch (CoreException e) { } } } info.setChildren(vChildren); return true; } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.IIncludeReference#isOnIncludeEntry(org.eclipse.core.runtime.IPath) */ public boolean isOnIncludeEntry(IPath path) { if (fIncludeEntry.getFullIncludePath().isPrefixOf(path) && !CoreModelUtil.isExcluded(path, fIncludeEntry.fullExclusionPatternChars())) { return true; } return false; } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.ICElement#getPath() */ @Override public IPath getPath() { return fPath; } @Override public ICElement getHandleFromMemento(String token, MementoTokenizer memento) { return null; } @Override public void getHandleMemento(StringBuilder buff) { ((CElement)getParent()).getHandleMemento(buff); } @Override protected char getHandleMementoDelimiter() { Assert.isTrue(false, "Should not be called"); //$NON-NLS-1$ return 0; } }