/******************************************************************************* * Copyright (c) 2004, 2009 IBM Corporation 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: * IBM - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.utils.xcoff.parser; import java.io.EOFException; import java.io.IOException; import org.eclipse.cdt.core.AbstractCExtension; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IBinaryParser; import org.eclipse.cdt.utils.DefaultGnuToolFactory; import org.eclipse.cdt.utils.IGnuToolFactory; import org.eclipse.cdt.utils.xcoff.AR; import org.eclipse.cdt.utils.xcoff.XCoff32; import org.eclipse.core.runtime.IPath; /** * XCOFF 32bit binary parser for AIX * * @author vhirsl */ public class XCOFF32Parser extends AbstractCExtension implements IBinaryParser { private IGnuToolFactory toolFactory; /* * (non-Javadoc) * * @see org.eclipse.cdt.core.IBinaryParser#getBinary(byte[], * org.eclipse.core.runtime.IPath) */ public IBinaryFile getBinary(byte[] hints, IPath path) throws IOException { if (path == null) { throw new IOException(CCorePlugin.getResourceString("Util.exception.nullPath")); //$NON-NLS-1$ } IBinaryFile binary = null; try { XCoff32.Attribute attribute = null; if (hints != null && hints.length > 0) { try { attribute = XCoff32.getAttributes(hints); } catch (EOFException eof) { // continue, the array was to small. } } //Take a second run at it if the data array failed. if (attribute == null) { attribute = XCoff32.getAttributes(path.toOSString()); } if (attribute != null) { switch (attribute.getType()) { case XCoff32.Attribute.XCOFF_TYPE_EXE : binary = createBinaryExecutable(path); break; case XCoff32.Attribute.XCOFF_TYPE_SHLIB : binary = createBinaryShared(path); break; case XCoff32.Attribute.XCOFF_TYPE_OBJ : binary = createBinaryObject(path); break; case XCoff32.Attribute.XCOFF_TYPE_CORE : binary = createBinaryCore(path); break; } } } catch (IOException e) { binary = createBinaryArchive(path); } return binary; } /* * (non-Javadoc) * * @see org.eclipse.cdt.core.IBinaryParser#getBinary(org.eclipse.core.runtime.IPath) */ public IBinaryFile getBinary(IPath path) throws IOException { return getBinary(null, path); } /* * (non-Javadoc) * * @see org.eclipse.cdt.core.IBinaryParser#getFormat() */ public String getFormat() { return "XCOFF32"; //$NON-NLS-1$ } /* * (non-Javadoc) * * @see org.eclipse.cdt.core.IBinaryParser#isBinary(byte[], * org.eclipse.core.runtime.IPath) */ public boolean isBinary(byte[] hints, IPath path) { return XCoff32.isXCOFF32Header(hints) || AR.isARHeader(hints); } /* * (non-Javadoc) * * @see org.eclipse.cdt.core.IBinaryParser#getHintBufferSize() */ public int getHintBufferSize() { return 512; } /** * @param path * @return */ private IBinaryFile createBinaryExecutable(IPath path) { return new XCOFFBinaryExecutable(this, path); } /** * @param path * @return */ private IBinaryShared createBinaryShared(IPath path) { return new XCOFFBinaryShared(this, path); } /** * @param path * @return */ private IBinaryObject createBinaryObject(IPath path) { return new XCOFFBinaryObject(this, path, IBinaryFile.OBJECT); } /** * @param path * @return */ private IBinaryObject createBinaryCore(IPath path) { return new XCOFFBinaryObject(this, path, IBinaryFile.CORE); } /** * @param path * @return @throws * IOException */ private IBinaryFile createBinaryArchive(IPath path) throws IOException { return new XCOFFBinaryArchive(this, path); } /** * @return */ private DefaultGnuToolFactory createGNUToolFactory() { return new DefaultGnuToolFactory(this); } /* * (non-Javadoc) * * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ @SuppressWarnings("rawtypes") @Override public Object getAdapter(Class adapter) { if (adapter.equals(IGnuToolFactory.class)) { if (toolFactory == null) { toolFactory = createGNUToolFactory(); } return toolFactory; } return super.getAdapter(adapter); } }