summaryrefslogtreecommitdiff
path: root/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SectFile.java
blob: 9d53a21999a8065e0907aff2a9b40d9f948f7343 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/** @file
This file is to define nested element which is meant for specifying section file

Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/
package org.tianocore.framework.tasks;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import org.apache.tools.ant.BuildException;

/**
 Class SectFile is to define a class corresponding to ANT nested element. It's
 used to specify section file(s) when used with GenFfsFile task
 **/
public class SectFile implements Section {
    private String fileName = ""; /// section file name
    private int alignment = 0;

    /**
     Get method of ANT task/datatype for "FileName" attribute
  
     @returns The name of section file
     **/
    public String getFileName() {
        return fileName;
    }

    /**
     Set method of ANT task/datatype for "FileName" attribute
  
     @param   fileName    The name of section file
     **/
    public void setFileName(String fileName) {
        this.fileName = fileName;   
    }

    public int getAlignment() {
        return alignment;
    }

    public void setAlignment(int alignment) {
        if (alignment > 7) {
            this.alignment = 7;
        } else {
            this.alignment = alignment;
        }
    }

    public SectFile (){
    }

    /**
     Put the content of section file into specified buffer with extra bytes for 
     alignment requirement.
  
     @param   Buffer  buffer to contain the section file content with alignment
     **/
    public void toBuffer (DataOutputStream buffer){
        File   sectFile;
        int    fileLen;

        ///
        /// open file
        ///
        sectFile = new File (this.fileName);  

        ///
        /// check if file exist.
        ///     
        if (! sectFile.exists()) {
            throw new BuildException("The file  " + this.fileName + "  is not exist!\n");     
        }


        ///
        /// Read section file and add it's contains to buffer.
        ///
        try {

            FileInputStream fs = new FileInputStream (sectFile.getAbsoluteFile());
            DataInputStream In = new DataInputStream (fs);
            fileLen            = (int)sectFile.length();
            byte[] sectBuffer  = new byte[fileLen];
            In.read(sectBuffer);
            buffer.write(sectBuffer);

            ///
            /// 4 byte alignment
            ///
            while ((fileLen & 0x03)!= 0) {
                fileLen ++;
                buffer.writeByte(0);
            } 

            ///
            /// close inputStream
            ///
            In.close();

        } catch (Exception e) {
            System.out.print(e.getMessage());
            throw new BuildException("SectFile, toBuffer failed!\n");            
        }
    }
}