186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectpackage org.clearsilver;
286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.io.FileNotFoundException;
486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.io.IOException;
586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.util.Calendar;
786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.util.Date;
886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectimport java.util.TimeZone;
986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
1086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project/** This class is a wrapper around the HDF C API.  Many features of the C API
1186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project *  are not yet exposed through this wrapper.
1286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project */
1386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Projectpublic class HDF {
1486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  long hdfptr;  // stores the C HDF* pointer
1586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  HDF root;    // If this is a child HDF node, points at the root node of
1686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project               // the tree.  For root nodes this is null.  A child node needs
1786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project               // to hold a reference on the root to prevent the root from
1886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project               // being GC-ed.
1986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  static {
2086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    JNI.loadLibrary();
2186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
2286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
2386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Constructs an empty HDF dataset */
2486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public HDF() {
2586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    hdfptr = _init();
2686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    root = null;
2786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
2886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
2986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Constructs an HDF child node.  Used by other methods in this class when
3086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   * a child node needs to be constructed.
3186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
3286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private HDF(long hdfptr, HDF parent) {
3386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    this.hdfptr = hdfptr;
3486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    this.root = (parent.root != null) ? parent.root : parent;
3586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
3686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
3786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Clean up allocated memory if neccesary. close() allows application
3886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  to force clean up.
3986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
4086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public void close() {
4186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    // Only root nodes have ownership of the C HDF pointer, so only a root
4286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    // node needs to dealloc hdfptr.dir
4386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if ( root == null) {
4486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      if (hdfptr != 0) {
4586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project        _dealloc(hdfptr);
4686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project        hdfptr = 0;
4786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      }
4886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
4986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
5086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
5186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Call close() just in case when deallocating Java object.
5286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
5386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  // Should be protected access (like Object).
5486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  protected void finalize() throws Throwable {
5586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    close();
5686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    super.finalize();
5786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
5886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
5986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Loads the contents of the specified HDF file from disk into the current
6086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  HDF object.  The loaded contents are merged with the existing contents.
6186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
6286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public boolean readFile(String filename) throws IOException,
6386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project         FileNotFoundException {
6486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
6586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
6686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
6786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _readFile(hdfptr, filename, fileLoader != null);
6886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
6986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
7086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  protected String fileLoad(String filename) throws IOException,
7186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project            FileNotFoundException {
7286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
7386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
7486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
7586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    CSFileLoader aFileLoader = fileLoader;
7686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (aFileLoader == null) {
7786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("No fileLoader specified.");
7886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    } else {
7986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      String result = aFileLoader.load(this, filename);
8086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      if (result == null) {
8186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project        throw new NullPointerException("CSFileLoader.load() returned null");
8286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      }
8386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      return result;
8486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
8586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
8686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
8786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  // The optional CS file loader to use to read in files
8886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private CSFileLoader fileLoader = null;
8986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
9086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /**
9186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   * Get the file loader in use, if any.
9286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   * @return the file loader in use.
9386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
9486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public CSFileLoader getFileLoader() {
9586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return fileLoader;
9686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
9786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
9886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /**
9986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   * Set the CS file loader to use
10086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   * @param fileLoader the file loader that should be used.
10186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
10286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public void setFileLoader(CSFileLoader fileLoader) {
10386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    this.fileLoader = fileLoader;
10486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
10586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
10686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Serializes HDF contents to a file (readable by readFile)
10786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
10886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public boolean writeFile(String filename) throws IOException {
10986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
11086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
11186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
11286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _writeFile(hdfptr, filename);
11386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
11486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
11586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Serializes HDF contents to a file (readable by readFile), but
11686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  writes the file atomically by writing to a temp file then doing a
11786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  rename(2) on it.
11886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
11986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public boolean writeFileAtomic(String filename) throws IOException {
12086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
12186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
12286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
12386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _writeFileAtomic(hdfptr, filename);
12486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
12586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
12686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Parses/loads the contents of the given string as HDF into the current
12786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  HDF object.  The loaded contents are merged with the existing contents.
12886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
12986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public boolean readString(String data) {
13086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
13186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
13286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
13386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _readString(hdfptr, data);
13486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
13586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
13686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Serializes HDF contents to a string (readable by readString)
13786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
13886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public String writeString() {
13986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
14086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
14186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
14286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _writeString(hdfptr);
14386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
14486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
14586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Retrieves the integer value at the specified path in this HDF node's
14686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  subtree.  If the value does not exist, or cannot be converted to an
14786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  integer, default_value will be returned. */
14886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public int getIntValue(String hdfname, int default_value) {
14986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
15086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
15186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
15286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _getIntValue(hdfptr,hdfname,default_value);
15386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
15486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
15586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Retrieves the value at the specified path in this HDF node's subtree.
15686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  */
15786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public String getValue(String hdfname, String default_value) {
15886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
15986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
16086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
16186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _getValue(hdfptr,hdfname,default_value);
16286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
16386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
16486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Sets the value at the specified path in this HDF node's subtree. */
16586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public void setValue(String hdfname, String value) {
16686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
16786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
16886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
16986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    _setValue(hdfptr,hdfname,value);
17086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
17186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
17286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Remove the specified subtree. */
17386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public void removeTree(String hdfname) {
17486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
17586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
17686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
17786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    _removeTree(hdfptr,hdfname);
17886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
17986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
18086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Links the src hdf name to the dest. */
18186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public void setSymLink(String hdf_name_src, String hdf_name_dest) {
18286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
18386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
18486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
18586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    _setSymLink(hdfptr,hdf_name_src,hdf_name_dest);
18686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
18786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
18886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Export a date to a clearsilver tree using a specified timezone */
18986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public void exportDate(String hdfname, TimeZone timeZone, Date date) {
19086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
19186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
19286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
19386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
19486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    Calendar cal = Calendar.getInstance(timeZone);
19586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    cal.setTime(date);
19686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
19786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    String sec = Integer.toString(cal.get(Calendar.SECOND));
19886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".sec", sec.length() == 1 ? "0" + sec : sec);
19986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
20086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    String min = Integer.toString(cal.get(Calendar.MINUTE));
20186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".min", min.length() == 1 ? "0" + min : min);
20286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
20386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".24hour",
20486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project             Integer.toString(cal.get(Calendar.HOUR_OF_DAY)));
20586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    // java.util.Calendar uses represents 12 o'clock as 0
20686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".hour",
20786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project             Integer.toString(
20886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project                 cal.get(Calendar.HOUR) == 0 ? 12 : cal.get(Calendar.HOUR)));
20986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".am",
21086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project             cal.get(Calendar.AM_PM) == Calendar.AM ? "1" : "0");
21186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".mday",
21286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project             Integer.toString(cal.get(Calendar.DAY_OF_MONTH)));
21386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".mon",
21486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project             Integer.toString(cal.get(Calendar.MONTH)+1));
21586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".year",
21686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project             Integer.toString(cal.get(Calendar.YEAR)));
21786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".2yr",
21886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project             Integer.toString(cal.get(Calendar.YEAR)).substring(2));
21986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".wday",
22086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project             Integer.toString(cal.get(Calendar.DAY_OF_WEEK)));
22186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
22286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    boolean tzNegative = timeZone.getRawOffset() < 0;
22386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    int tzAbsolute = java.lang.Math.abs(timeZone.getRawOffset()/1000);
22486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    String tzHour = Integer.toString(tzAbsolute/3600);
22586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    String tzMin = Integer.toString(tzAbsolute/60 - (tzAbsolute/3600)*60);
22686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    String tzString = (tzNegative ? "-" : "+")
22786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project                      + (tzHour.length() == 1 ? "0" + tzHour : tzHour)
22886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project                      + (tzMin.length() == 1 ? "0" + tzMin : tzMin);
22986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    setValue(hdfname + ".tzoffset", tzString);
23086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
23186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
23286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Export a date to a clearsilver tree using a specified timezone */
23386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public void exportDate(String hdfname, String tz, int tt) {
23486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
23586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
23686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
23786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
23886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    TimeZone timeZone = TimeZone.getTimeZone(tz);
23986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
24086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (timeZone == null) {
24186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new RuntimeException("Unknown timezone: " + tz);
24286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
24386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
24486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    Date date = new Date((long)tt * 1000);
24586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
24686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    exportDate(hdfname, timeZone, date);
24786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
24886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
24986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Retrieves the HDF object that is the root of the subtree at hdfpath, or
25086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  null if no object exists at that path. */
25186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public HDF getObj(String hdfpath) {
25286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
25386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
25486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
25586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    long obj_ptr = _getObj(hdfptr, hdfpath);
25686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if ( obj_ptr == 0 ) {
25786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      return null;
25886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
25986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return new HDF(obj_ptr, this);
26086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
26186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
26286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Retrieves the HDF for the first child of the root of the subtree
26386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  at hdfpath, or null if no child exists of that path or if the
26486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  path doesn't exist. */
26586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public HDF getChild(String hdfpath) {
26686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
26786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
26886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
26986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    long obj_ptr = _getChild(hdfptr, hdfpath);
27086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if ( obj_ptr == 0 ) {
27186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      return null;
27286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
27386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return new HDF(obj_ptr, this);
27486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
27586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
27686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Return the root of the tree where the current node lies.  If the
27786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  current node is the root, return this. */
27886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public HDF getRootObj() {
27986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return root != null ? root : this;
28086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
28186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
28286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Retrieves the HDF object that is the root of the subtree at
28386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  hdfpath, create the subtree if it doesn't exist */
28486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public HDF getOrCreateObj(String hdfpath) {
28586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
28686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
28786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
28886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    long obj_ptr = _getObj(hdfptr, hdfpath);
28986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if ( obj_ptr == 0 ) {
29086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      // Create a node
29186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      _setValue(hdfptr, hdfpath, "");
29286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      obj_ptr = _getObj( hdfptr, hdfpath );
29386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      if ( obj_ptr == 0 ) {
29486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project        return null;
29586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      }
29686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
29786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return new HDF(obj_ptr, this);
29886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
29986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
30086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Returns the name of this HDF node.   The root node has no name, so
30186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  calling this on the root node will return null. */
30286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public String objName() {
30386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
30486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
30586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
30686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _objName(hdfptr);
30786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
30886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
30986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Returns the value of this HDF node, or null if this node has no value.
31086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  Every node in the tree can have a value, a child, and a next peer. */
31186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public String objValue() {
31286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
31386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
31486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
31586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _objValue(hdfptr);
31686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
31786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
31886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Returns the child of this HDF node, or null if there is no child.
31986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  Use this in conjunction with objNext to walk the HDF tree.  Every node
32086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  in the tree can have a value, a child, and a next peer. */
32186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public HDF objChild() {
32286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
32386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
32486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
32586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    long child_ptr = _objChild(hdfptr);
32686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if ( child_ptr == 0 ) {
32786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      return null;
32886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
32986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return new HDF(child_ptr, this);
33086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
33186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
33286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /** Returns the next sibling of this HDF node, or null if there is no next
33386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  sibling.  Use this in conjunction with objChild to walk the HDF tree.
33486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   *  Every node in the tree can have a value, a child, and a next peer. */
33586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public HDF objNext() {
33686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
33786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
33886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
33986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    long next_ptr = _objNext(hdfptr);
34086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if ( next_ptr == 0 ) {
34186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      return null;
34286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
34386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return new HDF(next_ptr, this);
34486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
34586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
34686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public void copy(String hdfpath, HDF src) {
34786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0 || src.hdfptr == 0) {
34886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
34986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
35086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    _copy(hdfptr, hdfpath, src.hdfptr);
35186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
35286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
35386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  /**
35486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   * Generates a string representing the content of the HDF tree rooted at
35586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   * this node.
35686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project   */
35786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  public String dump() {
35886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    if (hdfptr == 0) {
35986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project      throw new NullPointerException("HDF is closed.");
36086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    }
36186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project    return _dump(hdfptr);
36286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  }
36386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
36486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native long _init();
36586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native void _dealloc(long ptr);
36686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private native boolean _readFile(long ptr, String filename, boolean use_cb);
36786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native boolean _writeFile(long ptr, String filename);
36886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native boolean _writeFileAtomic(long ptr, String filename);
36986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native boolean _readString(long ptr, String data);
37086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native String _writeString(long ptr);
37186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native int _getIntValue(long ptr, String hdfname,
37286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project                                         int default_value);
37386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native String _getValue(long ptr, String hdfname,
37486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project                                         String default_value);
37586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native void _setValue(long ptr, String hdfname,
37686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project                                       String hdf_value);
37786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native void _removeTree(long ptr, String hdfname);
37886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native void _setSymLink(long ptr, String hdf_name_src,
37986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project                                       String hdf_name_dest);
38086abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native long _getObj(long ptr, String hdfpath);
38186abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native long _getChild(long ptr, String hdfpath);
38286abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native long _objChild(long ptr);
38386abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native long _objNext(long ptr);
38486abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native String _objName(long ptr);
38586abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native String _objValue(long ptr);
38686abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native void _copy(long destptr, String hdfpath, long srcptr);
38786abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project
38886abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project  private static native String _dump(long ptr);
38986abe4b9898668901b812fa6c1eaa38cb34989e2The Android Open Source Project}
390