c784a50107e6ee3088bc3b80eff3870edb423755
[mirror_edk2.git] / Tools / Source / FrameworkTasks / org / tianocore / framework / tasks / Tool.java
1 /** @file
2 This file is to define nested element which is meant for specifying a tool
3
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14 package org.tianocore.framework.tasks;
15
16 import java.io.DataInputStream;
17 import java.io.DataOutputStream;
18 import java.io.File;
19 import java.io.FileInputStream;
20 import java.util.ArrayList;
21 import java.util.Iterator;
22 import java.util.List;
23
24 import org.apache.tools.ant.BuildException;
25
26 /**
27 Class Tool is to define an external tool to be used for genffsfile
28 **/
29 public class Tool implements EfiDefine, Section {
30
31 String toolName = "";
32 List<Object> toolArgList = new ArrayList<Object>();
33 String outputPath;
34 String outPutFileName ;
35 List<Input> inputFiles = new ArrayList<Input>();
36
37 /**
38 Call extern tool
39
40 @param buffer The buffer to put the result with alignment
41 **/
42 public void toBuffer (DataOutputStream buffer, DataOutputStream orgBuffer){
43 File OutputFile;
44 byte data;
45
46 ///
47 /// call extern tool
48 ///
49 try {
50 executeTool ();
51 } catch (Exception e) {
52 throw new BuildException("Call tools failed!\n");
53 }
54
55 ///
56 /// check if file exist
57 ///
58 OutputFile = new File (this.outPutFileName);
59 long fileLen = OutputFile.length();
60 if (!OutputFile.exists()) {
61 throw new BuildException("The file " + outPutFileName + " is not exist!\n");
62 }
63
64 ///
65 /// Read output file and write it's cotains to buffer
66 ///
67 try {
68 FileInputStream fs = new FileInputStream (this.outPutFileName);
69 DataInputStream In = new DataInputStream (fs);
70
71 int i = 0;
72 while (i < fileLen) {
73 data = In.readByte();
74 buffer.writeByte(data);
75 //
76 // Add data to org file
77 //
78 orgBuffer.writeByte(data);
79 i ++;
80 }
81
82 ///
83 /// 4 byte alignment
84 ///
85 while ((fileLen & 0x03) != 0) {
86 fileLen++;
87 buffer.writeByte(0);
88 orgBuffer.writeByte(0);
89 }
90 In.close();
91
92 } catch (Exception e) {
93 System.out.print(e.getMessage());
94 throw new BuildException("Call tool2buffer failed!\n");
95 }
96 }
97
98 ///
99 /// execute external tool for genffsfile
100 ///
101 private void executeTool () {
102 String command = "";
103 String argument = "";
104 command = toolName;
105 Iterator argIter = toolArgList.iterator();
106 Iterator inputIter = inputFiles.iterator();
107 ToolArg toolArg;
108 Input file = null;
109
110 ///
111 /// argument of tools
112 ///
113 while (argIter.hasNext()) {
114 toolArg = (ToolArg)argIter.next();
115 argument = argument + toolArg.getLine() + " ";
116
117 }
118
119 ///
120 /// input files for tools
121 ///
122 argument = argument + "-i ";
123 while (inputIter.hasNext()) {
124 file = (Input)inputIter.next();
125 argument = argument + file.getFile() + " ";
126 }
127
128 outPutFileName = outputPath + File.separatorChar + (new File(file.getFile())).getName() + ".crc";
129 argument = argument + " -o " + outPutFileName;
130
131 try {
132
133 ///
134 /// execute command line
135 ///
136 Process crcProcess = Runtime.getRuntime().exec(command + " " + argument);
137 crcProcess.waitFor();
138 } catch (Exception e) {
139 System.out.print (e.getMessage());
140 throw new BuildException("Execute tools fails!\n");
141 }
142 }
143
144 /**
145 Add method of ANT task/datatype for nested ToolArg type of element
146
147 @param toolArg The ToolArg object containing arguments for the tool
148 **/
149 public void addToolArg (ToolArg toolArg) {
150 toolArgList.add (toolArg);
151 }
152
153 /**
154 Get method of ANT task/datatype for attribute "OutputPath"
155
156 @returns The name of output path
157 **/
158 public String getOutputPath() {
159 return outputPath;
160 }
161
162 /**
163 Set method of ANT task/datatype for attribute "OutputPath"
164
165 @param outputPath The name of output path
166 **/
167 public void setOutputPath(String outPutPath) {
168 this.outputPath = outPutPath;
169 }
170
171 /**
172 Get method of ANT task/datatype for attribute "ToolName"
173
174 @returns The name of the tool.
175 **/
176 public String getToolName() {
177 return toolName;
178 }
179
180 /**
181 Set method of ANT task/datatype for attribute "ToolName"
182
183 @param toolName The name of the tool
184 **/
185 public void setToolName(String toolName) {
186 this.toolName = toolName;
187 }
188
189 /**
190 Add method of ANT task/datatype for nested Input type of element
191
192 @param file The Input objec which represents a file
193 **/
194 public void addInput(Input file) {
195 inputFiles.add(file);
196 }
197 }
198
199