imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/managers/ProjectManager.java
changeset 0 61163b28edca
child 11 217e69fc5beb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/managers/ProjectManager.java	Tue Jan 12 13:17:53 2010 -0600
@@ -0,0 +1,302 @@
+/*
+* 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.imaker.internal.managers;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.EpocEngineHelper;
+import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.s60tools.imaker.IMakerUtils;
+import com.nokia.s60tools.imaker.internal.model.iContent.IContentFactory;
+import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
+import com.nokia.s60tools.imaker.internal.model.iContent.ImageContent;
+
+public class ProjectManager {
+	public static final String NEW_ITEM            = "<New Configuration>";
+	public static final String IBY_FILENAME_PREFIX = "imaker_additional_";
+	public static final String IBY_FOLDER_NAME     = "rombuild";
+	public static final String MAKEFILE_NAME       = "imaker_additions.mk";
+
+	private String activeFile = "";
+	private IProject project;
+	private ArrayList<IResource> imakerFiles;
+
+	public ProjectManager(IProject project) {
+		this.imakerFiles = new ArrayList<IResource>();
+		this.project = project;
+	}
+
+	public String getActiveFile() {
+		return activeFile;
+	}
+
+	public void setActiveFile(String newActive) {
+		activeFile = newActive;
+		
+	}
+	
+	public IProject getProject() {
+		return project;
+	}
+	
+	/**
+	 * @return The root location of the project
+	 */
+	public String getRoot() {
+		return IMakerUtils.getProjectRootLocation(project);
+	}
+	
+	
+	/**
+	 * Returns the imaker file in the specified location
+	 * @param location
+	 * @return
+	 */
+	public IResource getImakerFile(IPath location) {
+		IResource ret = null;
+		for (IResource resource : getImakerFiles()) {
+			if(resource.getLocation().equals(location)) {
+				ret = resource;
+				break;
+			}
+		}
+		return ret;
+	}
+
+//	public IFile getImakerMakeFile() {
+//		IFolder pfolder = project.getFolder(IBY_FOLDER_NAME);
+//		IFile mk = pfolder.getFile(MAKEFILE_NAME);
+//		if(mk.exists()) {
+//			return mk;
+//		} else {
+//			return null;
+//		}
+//	}
+
+
+	/**
+	 * Returns all imaker files in the selected project
+	 * @return
+	 */
+	public List<IResource> getImakerFiles() {
+		imakerFiles.clear();
+		try {
+			project.accept(new ImakerResourceVisitor(imakerFiles));
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+		return imakerFiles;
+	}
+	
+	private class ImakerResourceVisitor implements IResourceVisitor {
+
+		private ArrayList<IResource> list;
+
+		/**
+		 * @param imps
+		 */
+		public ImakerResourceVisitor(ArrayList<IResource> imps) {
+			this.list = imps;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.core.resources.IResourceVisitor#visit(org.eclipse.core.resources.IResource)
+		 */
+//		@Override
+		public boolean visit(IResource res) throws CoreException {
+			String name = res.getName();
+			if(name.endsWith(".imp")) {
+				list.add(res);
+			}
+			if(res instanceof IFolder) {
+				if(name.equals("src") || name.equals("inc")) {
+					return false;
+				}
+			}
+			return true;
+		}
+		
+	}
+
+	/**
+	 * Creates new iby file to the specified location, with the specified content
+	 * @param basename The name of the iby file, without the extension
+	 * @param content The contents fo iby file
+	 * @param path parent folder of the iby file
+	 * @return The location or path of the newly created file
+	 */
+	public IPath createIbyFile(String basename, String content, IPath path) {
+		File parent = path.toFile();
+		createFolder(parent);
+		path = path.append(basename+".iby");
+		File file = path.toFile();
+		
+		FileOutputStream fo;
+		try {
+			if(!file.exists()) {
+				file.createNewFile();
+			}
+			fo = new FileOutputStream(file);
+			OutputStreamWriter osw = new OutputStreamWriter(fo);
+			
+			Writer out = new BufferedWriter(osw);
+			out.write(content);
+			out.flush();
+			out.close();
+			return new Path(file.getAbsolutePath());
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	private void createFolder(File folder) {
+		if(folder!=null&&!folder.exists()) {
+			String parent = folder.getParent();
+			File f = new File(parent);
+			createFolder(f);
+			folder.mkdir();
+		}
+	}
+
+	public IPath createAdditionsMakefile(List<IPath> files, IPath path) {
+		createFolder(path.toFile());
+		IPath mk = path.append(MAKEFILE_NAME);
+		File mkFile = mk.toFile();
+		
+		FileOutputStream fo;
+		try {
+			StringBuffer sb = new StringBuffer();
+			for (IPath p : files) {
+				File f = p.toFile();
+				String name = f.getName();
+				int index = name.lastIndexOf('_');
+				String loc = name.substring(index+1, name.length()-4);
+				loc = loc.toUpperCase();
+				sb.append(loc+"_OBY += " + f.getAbsolutePath()+"\n");
+			}
+
+			fo = new FileOutputStream(mkFile);
+			OutputStreamWriter osw = new OutputStreamWriter(fo);
+			
+			Writer out = new BufferedWriter(osw);
+			out.write(sb.toString());
+			out.flush();
+			out.close();
+			return new Path(mkFile.getAbsolutePath());
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * Populate the model of the dialog with content from the selected project
+	 * @param ic
+	 */
+	public void populate(ImageContent ic) {
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+		if (cpi != null) {
+			ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+			String filename = null;
+			
+			boolean debug = "udeb".equalsIgnoreCase(buildConfig.getTargetString());
+			// add the binaries and any resource-type files generated by all mmp files in the project
+			for (IPath mmp : EpocEngineHelper.getMMPFilesForBuildConfiguration(buildConfig)) {
+				IPath hp = EpocEngineHelper.getHostPathForExecutable(buildConfig, mmp);
+				IPath tp = EpocEngineHelper.getTargetPathForExecutable(buildConfig, mmp);
+				
+				filename = hp.segment(hp.segmentCount()-1);
+				
+				// add component executable
+				if (hp != null) {
+					addEntry(ic, debug, hp.toOSString(), tp.toOSString(), filename);
+				}
+
+				HashMap<String, String> hostTargetRSRCMap = EpocEngineHelper.getHostAndTargetResources(buildConfig, mmp);
+				// Add resource files...
+				for (String key : hostTargetRSRCMap.keySet()) {
+					filename = new File(key).getName();
+					addEntry(ic, false, key, hostTargetRSRCMap.get(key),filename);
+				}
+			}
+
+			// check the project for image makefiles
+			HashMap<String, String> hostTargetImagesMap = EpocEngineHelper.getHostAndTargetImages(buildConfig);
+			for (String key : hostTargetImagesMap.keySet()) {
+				filename = new File(key).getName();				
+				addEntry(ic, false, key, hostTargetImagesMap.get(key), filename);
+			}
+		}	
+	}
+
+	private void addEntry(ImageContent ic, boolean debug,
+			String hp, String tp, String filename) {
+		IbyEntry entry = IContentFactory.eINSTANCE.createIbyEntry();
+		if(hp.length()>2) {
+			hp = hp.substring(2);
+		}
+		entry.setFile(hp);
+
+		if(tp!=null&&!tp.endsWith(filename)) {
+			if(tp.endsWith(File.separator)) {
+				tp = tp + filename;
+			} else {
+				tp = tp + File.separator + filename;
+			}
+		}
+		if(tp!=null) {
+			tp = tp.substring(2);			
+		}
+		entry.setTarget(tp);
+		entry.setDebug(debug);
+		boolean contains = false;
+		for (IbyEntry e : ic.getEntries()) {
+			if(e.equals(entry)) {
+				contains = true;
+				break;
+			}
+		}
+		if(!contains) {
+			ic.getEntries().add(entry);
+		}
+	}
+}