PropertySet.java
上传用户:btjssb159
上传日期:2018-01-04
资源大小:241k
文件大小:9k
源码类别:

DNA

开发平台:

Java

  1. /*
  2.  * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without 
  5.  * modification, are permitted provided that the following conditions are met:
  6.  * 
  7.  * -Redistributions of source code must retain the above copyright notice, this 
  8.  * list of conditions and the following disclaimer.
  9.  *
  10.  * -Redistribution in binary form must reproduct the above copyright notice,
  11.  * this list of conditions and the following disclaimer in the documentation
  12.  * and/or other materials provided with the distribution.
  13.  * 
  14.  * Neither the name of Sun Microsystems, Inc. or the names of contributors may
  15.  * be used to endorse or promote products derived from this software without
  16.  * specific prior written permission.
  17.  * 
  18.  * This software is provided "AS IS," without a warranty of any kind. ALL
  19.  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
  20.  * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  21.  * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
  22.  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
  23.  * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
  24.  * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
  25.  * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
  26.  * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
  27.  * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
  28.  * POSSIBILITY OF SUCH DAMAGES.
  29.  * 
  30.  * You acknowledge that Software is not designed,licensed or intended for use in 
  31.  * the design, construction, operation or maintenance of any nuclear facility.
  32.  */
  33. import java.io.IOException;
  34. import java.util.Date;
  35. import java.util.Hashtable;
  36. class Property {
  37.     private int type;
  38.     private int offset;
  39.     public Property(int type, int offset) {
  40.         this.type = type;
  41.         this.offset = offset;
  42.     }
  43.     public int getType() {
  44.         return type;
  45.     }
  46.     public int getOffset() {
  47.         return offset;
  48.     }
  49. }
  50. class PropertySet {
  51.     private static final int TYPE_VT_EMPTY = -1;
  52.     private static final int TYPE_VT_NULL = -1;
  53.     private static final int TYPE_VT_I2 = 2;
  54.     private static final int TYPE_VT_I4 = 3;
  55.     private static final int TYPE_VT_R4 = -1;
  56.     private static final int TYPE_VT_R8 = -1;
  57.     private static final int TYPE_VT_CY = -1;
  58.     private static final int TYPE_VT_DATE = -1;
  59.     private static final int TYPE_VT_BSTR = -1;
  60.     private static final int TYPE_VT_ERROR = -1;
  61.     private static final int TYPE_VT_BOOL = -1;
  62.     private static final int TYPE_VT_VARIANT = -1;
  63.     private static final int TYPE_VT_UI1 = -1;
  64.     private static final int TYPE_VT_UI2 = -1;
  65.     private static final int TYPE_VT_UI4 = 19;
  66.     private static final int TYPE_VT_I8 = -1;
  67.     private static final int TYPE_VT_UI8 = -1;
  68.     private static final int TYPE_VT_LPSTR = 30;
  69.     private static final int TYPE_VT_LPWSTR = 31;
  70.     private static final int TYPE_VT_FILETIME = 64;
  71.     private static final int TYPE_VT_BLOB = 65;
  72.     private static final int TYPE_VT_STREAM = -1;
  73.     private static final int TYPE_VT_STORAGE = -1;
  74.     private static final int TYPE_VT_STREAMED_OBJECT = -1;
  75.     private static final int TYPE_VT_STORED_OBJECT = -1;
  76.     private static final int TYPE_VT_BLOB_OBJECT = -1;
  77.     private static final int TYPE_VT_CF = 71;
  78.     private static final int TYPE_VT_CLSID = 72;
  79.     private static final int TYPE_VT_VECTOR = 4096;
  80.     SeekableStream stream;
  81.     Hashtable properties = new Hashtable();
  82.     
  83.     public PropertySet(SeekableStream stream) throws IOException {
  84.         this.stream = stream;
  85.         
  86.         stream.seek(44);
  87.         int sectionOffset = stream.readIntLE();
  88.         stream.seek(sectionOffset);
  89.         int sectionSize = stream.readIntLE();
  90.         int sectionCount = stream.readIntLE();
  91.         
  92.         for (int i = 0; i < sectionCount; i++) {
  93.             stream.seek(sectionOffset + 8*i + 8);
  94.             int pid = stream.readIntLE();
  95.             int offset = stream.readIntLE();
  96.             stream.seek(sectionOffset + offset);
  97.             int type = stream.readIntLE();
  98.             Property p = new Property(type, sectionOffset + offset + 4);
  99.             properties.put(new Integer(pid), p);
  100.         }
  101.     }
  102.     public boolean hasProperty(int id) {
  103.         Property p = (Property)properties.get(new Integer(id));
  104.         return (p != null);
  105.     }
  106.     public int getI4(int id) {
  107.         Property p = (Property)properties.get(new Integer(id));
  108.         try {
  109.             int offset = p.getOffset();
  110.             stream.seek(offset);
  111.             return stream.readIntLE();
  112.         } catch (IOException e) {
  113.             e.printStackTrace();
  114.         }
  115.         return -1;
  116.     }
  117.     public int getUI1(int id) {
  118.         Property p = (Property)properties.get(new Integer(id));
  119.         try {
  120.             int offset = p.getOffset();
  121.             stream.seek(offset);
  122.             return stream.readUnsignedByte();
  123.         } catch (IOException e) {
  124.             e.printStackTrace();
  125.         }
  126.         return -1;
  127.     }
  128.     public int getUI2(int id) {
  129.         Property p = (Property)properties.get(new Integer(id));
  130.         try {
  131.             int offset = p.getOffset();
  132.             stream.seek(offset);
  133.             return stream.readUnsignedShortLE();
  134.         } catch (IOException e) {
  135.             e.printStackTrace();
  136.         }
  137.         return -1;
  138.     }
  139.     public long getUI4(int id) {
  140.         Property p = (Property)properties.get(new Integer(id));
  141.         try {
  142.             int offset = p.getOffset();
  143.             stream.seek(offset);
  144.             return stream.readUnsignedIntLE();
  145.         } catch (IOException e) {
  146.             e.printStackTrace();
  147.         }
  148.         return -1;
  149.     }
  150.     public long getUI4(int id, long defaultValue) {
  151.         Property p = (Property)properties.get(new Integer(id));
  152.         if (p == null) {
  153.             return defaultValue;
  154.         }
  155.         try {
  156.             int offset = p.getOffset();
  157.             stream.seek(offset);
  158.             return stream.readUnsignedIntLE();
  159.         } catch (IOException e) {
  160.             e.printStackTrace();
  161.         }
  162.         return -1;
  163.     }
  164.     public String getLPSTR(int id) {
  165.         Property p = (Property)properties.get(new Integer(id));
  166.         if (p == null) {
  167.             return null;
  168.         }
  169.         try {
  170.             int offset = p.getOffset();
  171.             stream.seek(offset);
  172.             int length = stream.readIntLE();
  173.             StringBuffer sb = new StringBuffer(length);
  174.             for (int i = 0; i < length; i++) {
  175.                 sb.append((char)stream.read());
  176.             }
  177.             
  178.             return sb.toString();
  179.         } catch (IOException e) {
  180.             e.printStackTrace();
  181.             return null;
  182.         }
  183.     }
  184.     public String getLPWSTR(int id) {
  185.         Property p = (Property)properties.get(new Integer(id));
  186.         try {
  187.             int offset = p.getOffset();
  188.             stream.seek(offset);
  189.             int length = stream.readIntLE();
  190.             StringBuffer sb = new StringBuffer(length);
  191.             for (int i = 0; i < length; i++) {
  192.                 sb.append(stream.readCharLE());
  193.             }
  194.             
  195.             return sb.toString();
  196.         } catch (IOException e) {
  197.             e.printStackTrace();
  198.             return null;
  199.         }
  200.     }
  201.     public float getR4(int id) {
  202.         Property p = (Property)properties.get(new Integer(id));
  203.         try {
  204.             int offset = p.getOffset();
  205.             stream.seek(offset);
  206.             return stream.readFloatLE();
  207.         } catch (IOException e) {
  208.             e.printStackTrace();
  209.             return -1.0F;
  210.         }
  211.     }
  212.     public Date getDate(int id) {
  213.         throw new RuntimeException(JaiI18N.getString("PropertySet0"));
  214.     }
  215.     public Date getFiletime(int id) {
  216.         throw new RuntimeException(JaiI18N.getString("PropertySet0"));
  217.     }
  218.     public byte[] getBlob(int id) {
  219.         Property p = (Property)properties.get(new Integer(id));
  220.         try {
  221.             int offset = p.getOffset();
  222.             stream.seek(offset);
  223.             int length = stream.readIntLE();
  224.             
  225.             byte[] buf = new byte[length];
  226.             stream.seek(offset + 4);
  227.             stream.readFully(buf);
  228.             return buf;
  229.         } catch (IOException e) {
  230.             e.printStackTrace();
  231.             return null;
  232.         }
  233.     }
  234.     public int[] getUI1Vector(int id) {
  235.         throw new RuntimeException(JaiI18N.getString("PropertySet0"));
  236.     }
  237.     public int[] getUI2Vector(int id) {
  238.         throw new RuntimeException(JaiI18N.getString("PropertySet0"));
  239.     }
  240.     public long[] getUI4Vector(int id) {
  241.         throw new RuntimeException(JaiI18N.getString("PropertySet0"));
  242.     }
  243.     public float[] getR4Vector(int id) {
  244.         throw new RuntimeException(JaiI18N.getString("PropertySet0"));
  245.     }
  246.     public String[] getLPWSTRVector(int id) {
  247.         throw new RuntimeException(JaiI18N.getString("PropertySet0"));
  248.     }
  249. }