// ********************************************************************** // // <copyright> // // BBN Technologies // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** // // $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/layer/nitf/NitfHeader.java,v $ // $RCSfile: NitfHeader.java,v $ // $Revision: 1.3 $ // $Date: 2004/10/14 18:06:01 $ // $Author: dietrick $ // // ********************************************************************** /* * The meat of this code is based on source code provided by * The MITRE Corporation, through the browse application source * code. Many thanks to Nancy Markuson who provided BBN with the * software, and to Theron Tock, who wrote the software, and * Daniel Scholten, who revised it - (c) 1994 The MITRE * Corporation for those parts, and used with permission. */ package com.bbn.openmap.layer.nitf; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import com.bbn.openmap.io.BinaryBufferedFile; import com.bbn.openmap.io.BinaryFile; import com.bbn.openmap.io.FormatException; /** * The NitfHeader reads the header information in a NITF (National Imagery * Transmission Format) and makes the section location information available. */ public class NitfHeader { public final static int NITF_IMAGE_DES_SIZE = 16; public final static int NITF_SYMBOLS_DES_SIZE = 10; public final static int NITF_LABELS_DES_SIZE = 7; public final static int NITF_TEXT_DES_SIZE = 9; public final static int NITF_DATAEXT_DES_SIZE = 13; public final static int NITF_RESEXT_DES_SIZE = 11; public final static int NITF_USERDEF_SIZE = 19; /** File type and Version */ public String FHDR;// [9] /** Compliance Level */ public String CLEVEL;// [2] /** System Type */ public String STYPE;// [3] /** Originating Station ID */ public String OSTAID;// [10] /** File Date and Time */ public String FDT;// [14] /** File Title */ public String FTITLE;// [80] /** File Security Classification */ public String FSCLAS;// [1] /** File Codewords */ public String FSCODE;// [40] /** File Control and Handling */ public String FSCTLH;// [40] /** File Releasing Instructions */ public String FSREL;// [40] /** File Classification Authority */ public String FSCAUT;// [20] /** File Security Control Number */ public String FSCTLN;// [20] /** File Security Downgrade */ public String FSDWNG;// [6] /** File Downgrading Event */ public String FSDEVT;// [40] /** Message Copy Number */ public String FSCOP;// [5] /** Message Number of Copies */ public String FSCPYS;// [5] /** Encryption */ public String ENCRYP;// [1] /** Originator's Name */ public String ONAME;// [27] /** Originator's Phone Number */ public String OPHONE;// [18] /** File Length */ public String FL;// [12] /** NITF File Header Length */ public String HL;// [6] public NitfHeaderAmounts nha; public NitfUserDef nud; public NitfHeader() { nha = new NitfHeaderAmounts(); nud = new NitfUserDef(); } static public class NitfHeaderAmounts { /** Number of Images */ public String NUMI;// [3] /** Number of Symbols */ public String NUMS;// [3] /** Number of Labels */ public String NUML;// [3] /** Number of Text Files */ public String NUMT;// [3] /** Number of Data Extensions */ public String NUMDES;// [3] /** Number of Reserved Extensions */ public String NUMRES;// [3] } static public class NitfImageDescription { public String LISH;// [6] public String LI;// [10] } static public class NitfSymbolsDescription { public String LSSH;// [4] public String LS;// [6] } static public class NitfLabelDescription { public String LLSH;// [4] public String LL;// [3] } static public class NitfTextDescription { public String LTSH;// [4] public String LT;// [5] } static public class NitfDataExtDescription { public String LDSH;// [4] public String LD;// [9] } static public class NitfResExtDescription { public String LRSH;// [4] public String LR;// [7] } static public class NitfUserDef { public String UDHDL;// [5] public String UDHOFL;// [3] public String RETAG;// [6] public String REL;// [5] } /** * Reads the header part of the file. Will seek automatically to the * beginning of the file. * * @param binFile BinaryFile, opened on the NITF file. */ public boolean read(BinaryFile binFile) { try { binFile.seek(0); FHDR = binFile.readFixedLengthString(9); if (!FHDR.startsWith("NITF")) return false; /* Not an NITF file */ CLEVEL = binFile.readFixedLengthString(2); STYPE = binFile.readFixedLengthString(4); OSTAID = binFile.readFixedLengthString(10); FDT = binFile.readFixedLengthString(14); FTITLE = binFile.readFixedLengthString(80); FSCLAS = binFile.readFixedLengthString(1); FSCODE = binFile.readFixedLengthString(40); FSCTLH = binFile.readFixedLengthString(40); FSREL = binFile.readFixedLengthString(40); FSCAUT = binFile.readFixedLengthString(20); FSCTLN = binFile.readFixedLengthString(20); FSDWNG = binFile.readFixedLengthString(6); if (FSDWNG.startsWith("999998")) FSDEVT = binFile.readFixedLengthString(40); FSCOP = binFile.readFixedLengthString(5); FSCPYS = binFile.readFixedLengthString(5); ENCRYP = binFile.readFixedLengthString(1); ONAME = binFile.readFixedLengthString(27); OPHONE = binFile.readFixedLengthString(18); FL = binFile.readFixedLengthString(12); HL = binFile.readFixedLengthString(6); nha = readSectionInfo(binFile); nud.UDHDL = binFile.readFixedLengthString(5);// [5] nud.UDHOFL = binFile.readFixedLengthString(3);// [3] nud.RETAG = binFile.readFixedLengthString(6);// [6] nud.REL = binFile.readFixedLengthString(5);// [5] } catch (IOException e) { System.err.println("NitfHeader: File IO Error while reading header information:"); System.err.println(e); return false; } catch (FormatException f) { System.err.println("NitfHeader: File IO Format error while reading header information:"); System.err.println(f); return false; } return true; } protected NitfHeaderAmounts readSectionInfo(BinaryFile binFile) { try { nha.NUMI = binFile.readFixedLengthString(3); binFile.seek(binFile.getFilePointer() + (Integer.parseInt(nha.NUMI) * NITF_IMAGE_DES_SIZE)); nha.NUMS = binFile.readFixedLengthString(3); binFile.seek(binFile.getFilePointer() + (Integer.parseInt(nha.NUMS) * NITF_SYMBOLS_DES_SIZE)); nha.NUML = binFile.readFixedLengthString(3); binFile.seek(binFile.getFilePointer() + (Integer.parseInt(nha.NUML) * NITF_LABELS_DES_SIZE)); nha.NUMT = binFile.readFixedLengthString(3); binFile.seek(binFile.getFilePointer() + (Integer.parseInt(nha.NUMT) * NITF_TEXT_DES_SIZE)); nha.NUMDES = binFile.readFixedLengthString(3); binFile.seek(binFile.getFilePointer() + (Integer.parseInt(nha.NUMDES) * NITF_DATAEXT_DES_SIZE)); nha.NUMRES = binFile.readFixedLengthString(3); } catch (IOException e) { System.err.println("NitfHeader: File IO Error while reading header information:"); System.err.println(e); return null; } catch (FormatException f) { System.err.println("NitfHeader: File IO Format error while reading header information:"); System.err.println(f); return null; } return nha; } public String toString() { StringBuffer s = new StringBuffer(); s.append("\n\nNITF Information about ").append(FTITLE).append("\n"); s.append("-------------------\n"); s.append("File Type: ").append(FHDR).append("\n"); s.append("Compliance Level: ").append(CLEVEL).append("\n"); s.append("System Type: ").append(STYPE).append("\n"); s.append("Originating Station: ").append(OSTAID).append("\n"); s.append("File Date and Time: ").append(FDT).append("\n"); s.append("Originator's Name: ").append(ONAME).append("\n"); s.append("File Length: ").append(FL).append("\n\n"); s.append(nha.NUMI).append(" image\n"); s.append(nha.NUMS).append(" symbol\n"); s.append(nha.NUML).append(" label\n"); s.append(nha.NUMT).append(" text\n"); s.append(nha.NUMDES).append(" dataext\n"); s.append(nha.NUMRES).append(" resext\n"); return s.toString(); } public final static void main(String[] args) { if (args.length != 1) { System.out.println("Usage: java NitfHeader <path to NITF file>"); return; } File file = new File(args[0]); BinaryFile binFile = null; try { binFile = new BinaryBufferedFile(file); // binFile = new BinaryFile(file); NitfHeader header = new NitfHeader(); if (header.read(binFile)) { System.out.println(header); } else { System.out.println("NitfHeader: NOT read successfully!"); } } catch (FileNotFoundException e) { System.err.println("NitfHeader: file " + args[0] + " not found"); System.exit(1); } catch (IOException ioe) { System.err.println("NitfHeader: File IO Error while handling NITF header:"); System.err.println(ioe); } } }