You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
290 lines
8.9 KiB
290 lines
8.9 KiB
5 years ago
|
package com.fr.third.JAI;
|
||
|
/*
|
||
|
* Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions are met:
|
||
|
*
|
||
|
* -Redistributions of source code must retain the above copyright notice, this
|
||
|
* list of conditions and the following disclaimer.
|
||
|
*
|
||
|
* -Redistribution in binary form must reproduct the above copyright notice,
|
||
|
* this list of conditions and the following disclaimer in the documentation
|
||
|
* and/or other materials provided with the distribution.
|
||
|
*
|
||
|
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
|
||
|
* be used to endorse or promote products derived from this software without
|
||
|
* specific prior written permission.
|
||
|
*
|
||
|
* This software is provided "AS IS," without a warranty of any kind. ALL
|
||
|
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
|
||
|
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||
|
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
|
||
|
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||
|
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
|
||
|
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
|
||
|
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
|
||
|
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
|
||
|
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
|
||
|
* POSSIBILITY OF SUCH DAMAGES.
|
||
|
*
|
||
|
* You acknowledge that Software is not designed,licensed or intended for use in
|
||
|
* the design, construction, operation or maintenance of any nuclear facility.
|
||
|
*/
|
||
|
import java.io.IOException;
|
||
|
import java.util.Date;
|
||
|
import java.util.Hashtable;
|
||
|
|
||
|
|
||
|
class Property {
|
||
|
|
||
|
private int type;
|
||
|
private int offset;
|
||
|
|
||
|
public Property(int type, int offset) {
|
||
|
this.type = type;
|
||
|
this.offset = offset;
|
||
|
}
|
||
|
|
||
|
public int getType() {
|
||
|
return type;
|
||
|
}
|
||
|
|
||
|
public int getOffset() {
|
||
|
return offset;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class PropertySet {
|
||
|
|
||
|
private static final int TYPE_VT_EMPTY = -1;
|
||
|
private static final int TYPE_VT_NULL = -1;
|
||
|
private static final int TYPE_VT_I2 = 2;
|
||
|
private static final int TYPE_VT_I4 = 3;
|
||
|
private static final int TYPE_VT_R4 = -1;
|
||
|
private static final int TYPE_VT_R8 = -1;
|
||
|
private static final int TYPE_VT_CY = -1;
|
||
|
private static final int TYPE_VT_DATE = -1;
|
||
|
private static final int TYPE_VT_BSTR = -1;
|
||
|
private static final int TYPE_VT_ERROR = -1;
|
||
|
private static final int TYPE_VT_BOOL = -1;
|
||
|
private static final int TYPE_VT_VARIANT = -1;
|
||
|
private static final int TYPE_VT_UI1 = -1;
|
||
|
private static final int TYPE_VT_UI2 = -1;
|
||
|
private static final int TYPE_VT_UI4 = 19;
|
||
|
private static final int TYPE_VT_I8 = -1;
|
||
|
private static final int TYPE_VT_UI8 = -1;
|
||
|
private static final int TYPE_VT_LPSTR = 30;
|
||
|
private static final int TYPE_VT_LPWSTR = 31;
|
||
|
private static final int TYPE_VT_FILETIME = 64;
|
||
|
private static final int TYPE_VT_BLOB = 65;
|
||
|
private static final int TYPE_VT_STREAM = -1;
|
||
|
private static final int TYPE_VT_STORAGE = -1;
|
||
|
private static final int TYPE_VT_STREAMED_OBJECT = -1;
|
||
|
private static final int TYPE_VT_STORED_OBJECT = -1;
|
||
|
private static final int TYPE_VT_BLOB_OBJECT = -1;
|
||
|
private static final int TYPE_VT_CF = 71;
|
||
|
private static final int TYPE_VT_CLSID = 72;
|
||
|
private static final int TYPE_VT_VECTOR = 4096;
|
||
|
|
||
|
SeekableStream stream;
|
||
|
Hashtable properties = new Hashtable();
|
||
|
|
||
|
public PropertySet(SeekableStream stream) throws IOException {
|
||
|
this.stream = stream;
|
||
|
|
||
|
stream.seek(44);
|
||
|
int sectionOffset = stream.readIntLE();
|
||
|
|
||
|
stream.seek(sectionOffset);
|
||
|
int sectionSize = stream.readIntLE();
|
||
|
int sectionCount = stream.readIntLE();
|
||
|
|
||
|
for (int i = 0; i < sectionCount; i++) {
|
||
|
stream.seek(sectionOffset + 8*i + 8);
|
||
|
int pid = stream.readIntLE();
|
||
|
int offset = stream.readIntLE();
|
||
|
|
||
|
stream.seek(sectionOffset + offset);
|
||
|
int type = stream.readIntLE();
|
||
|
|
||
|
Property p = new Property(type, sectionOffset + offset + 4);
|
||
|
properties.put(new Integer(pid), p);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public boolean hasProperty(int id) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
return (p != null);
|
||
|
}
|
||
|
|
||
|
public int getI4(int id) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
try {
|
||
|
int offset = p.getOffset();
|
||
|
stream.seek(offset);
|
||
|
return stream.readIntLE();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
public int getUI1(int id) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
try {
|
||
|
int offset = p.getOffset();
|
||
|
stream.seek(offset);
|
||
|
return stream.readUnsignedByte();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
public int getUI2(int id) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
try {
|
||
|
int offset = p.getOffset();
|
||
|
stream.seek(offset);
|
||
|
return stream.readUnsignedShortLE();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
public long getUI4(int id) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
try {
|
||
|
int offset = p.getOffset();
|
||
|
stream.seek(offset);
|
||
|
return stream.readUnsignedIntLE();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
public long getUI4(int id, long defaultValue) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
if (p == null) {
|
||
|
return defaultValue;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
int offset = p.getOffset();
|
||
|
stream.seek(offset);
|
||
|
return stream.readUnsignedIntLE();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
public String getLPSTR(int id) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
if (p == null) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
int offset = p.getOffset();
|
||
|
|
||
|
stream.seek(offset);
|
||
|
int length = stream.readIntLE();
|
||
|
StringBuffer sb = new StringBuffer(length);
|
||
|
for (int i = 0; i < length; i++) {
|
||
|
sb.append((char)stream.read());
|
||
|
}
|
||
|
|
||
|
return sb.toString();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public String getLPWSTR(int id) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
try {
|
||
|
int offset = p.getOffset();
|
||
|
|
||
|
stream.seek(offset);
|
||
|
int length = stream.readIntLE();
|
||
|
StringBuffer sb = new StringBuffer(length);
|
||
|
for (int i = 0; i < length; i++) {
|
||
|
sb.append(stream.readCharLE());
|
||
|
}
|
||
|
|
||
|
return sb.toString();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public float getR4(int id) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
try {
|
||
|
int offset = p.getOffset();
|
||
|
stream.seek(offset);
|
||
|
return stream.readFloatLE();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
return -1.0F;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public Date getDate(int id) {
|
||
|
throw new RuntimeException(JaiI18N.getString("PropertySet0"));
|
||
|
}
|
||
|
|
||
|
public Date getFiletime(int id) {
|
||
|
throw new RuntimeException(JaiI18N.getString("PropertySet0"));
|
||
|
}
|
||
|
|
||
|
public byte[] getBlob(int id) {
|
||
|
Property p = (Property)properties.get(new Integer(id));
|
||
|
try {
|
||
|
int offset = p.getOffset();
|
||
|
stream.seek(offset);
|
||
|
int length = stream.readIntLE();
|
||
|
|
||
|
byte[] buf = new byte[length];
|
||
|
stream.seek(offset + 4);
|
||
|
stream.readFully(buf);
|
||
|
|
||
|
return buf;
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public int[] getUI1Vector(int id) {
|
||
|
throw new RuntimeException(JaiI18N.getString("PropertySet0"));
|
||
|
}
|
||
|
|
||
|
public int[] getUI2Vector(int id) {
|
||
|
throw new RuntimeException(JaiI18N.getString("PropertySet0"));
|
||
|
}
|
||
|
|
||
|
public long[] getUI4Vector(int id) {
|
||
|
throw new RuntimeException(JaiI18N.getString("PropertySet0"));
|
||
|
}
|
||
|
|
||
|
public float[] getR4Vector(int id) {
|
||
|
throw new RuntimeException(JaiI18N.getString("PropertySet0"));
|
||
|
}
|
||
|
|
||
|
public String[] getLPWSTRVector(int id) {
|
||
|
throw new RuntimeException(JaiI18N.getString("PropertySet0"));
|
||
|
}
|
||
|
}
|