帆软使用的第三方框架。
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

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"));
}
}