/*******************************************************************************
* Copyright (c) 2000, 2009 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
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
import java.util.Map;
import org.eclipse.cdt.core.IBinaryParser.IBinaryArchive;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.IArchive;
import org.eclipse.cdt.core.model.IBinary;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.internal.core.util.MementoTokenizer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
public class Archive extends Openable implements IArchive {
IBinaryArchive binaryArchive;
public Archive(ICElement parent, IFile file, IBinaryArchive ar) {
super(parent, file, ICElement.C_ARCHIVE);
binaryArchive = ar;
}
public Archive(ICElement parent, IPath path, IBinaryArchive ar) {
super (parent, path, ICElement.C_ARCHIVE);
binaryArchive = ar;
}
public IBinary[] getBinaries() throws CModelException {
ICElement[] e = getChildren();
IBinary[] b = new IBinary[e.length];
System.arraycopy(e, 0, b, 0, e.length);
return b;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.model.ICElement#isReadOnly()
*/
@Override
public boolean isReadOnly() {
return true;
}
@Override
public CElementInfo createElementInfo() {
return new ArchiveInfo(this);
}
protected ArchiveInfo getArchiveInfo() throws CModelException {
return (ArchiveInfo)getElementInfo();
}
@Override
protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map<ICElement, CElementInfo> newElements, IResource underlyingResource)
throws CModelException {
return computeChildren(info, underlyingResource);
}
public boolean computeChildren(OpenableInfo info, IResource res) {
IBinaryArchive ar = getBinaryArchive();
if (ar != null) {
IBinaryObject[] objects = ar.getObjects();
for (final IBinaryObject obj : objects) {
Binary binary = new Binary(this, ar.getPath().append(obj.getName()), obj);
info.addChild(binary);
}
} else {
return false;
}
return true;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
@SuppressWarnings("rawtypes")
@Override
public Object getAdapter(Class adapter) {
if (IBinaryArchive.class.equals(adapter)) {
return getBinaryArchive();
}
return super.getAdapter(adapter);
}
IBinaryArchive getBinaryArchive() {
return binaryArchive;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.model.ICElement#exists()
*/
@Override
public boolean exists() {
IResource res = getResource();
if (res != null)
return res.exists();
return super.exists();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.model.CElement#closing(java.lang.Object)
*/
@Override
protected void closing(Object info) throws CModelException {
ICProject cproject = getCProject();
CProjectInfo pinfo = (CProjectInfo)CModelManager.getDefault().peekAtInfo(cproject);
if (pinfo != null && pinfo.vLib != null) {
pinfo.vLib.removeChild(this);
}
super.closing(info);
}
@Override
public ICElement getHandleFromMemento(String token, MementoTokenizer memento) {
return null;
}
@Override
public String getHandleMemento() {
return null;
}
@Override
protected char getHandleMementoDelimiter() {
Assert.isTrue(false, "Should not be called"); //$NON-NLS-1$
return 0;
}
}