8f83ac2002-11-24Marcus Agehall // $Id: module.pmod.in,v 1.3 2002/11/24 22:14:39 agehall Exp $
94dd762002-11-24Marcus Agehall #pike __REAL_VERSION__ inherit @module@; //! Allows the user to open a Gzip archive and read and write //! it's contents in an uncompressed form, emulating the @[Stdio.File] //! interface. //! @note //! An important limitation on this class is that it may only be used //! for reading @b{or@} writing, not both at the same time. //! Please also note that if you want to reopen a file for reading //! after a write, you must close the file before calling open or //! strange effects might be the result. class File { inherit @module@._file;
8f83ac2002-11-24Marcus Agehall  private int is_open = 0;
94dd762002-11-24Marcus Agehall  //! @decl void create(void|string|int file, void|string mode) //! @param file //! Filename or filedescriptor of the gzip file to open. //! @param mode //! mode for the file. Defaults to "rb". //! @seealso //! @[open] @[Stdio.File] void create(mixed ... args) { ::create();
8f83ac2002-11-24Marcus Agehall  if(sizeof(args)) {
94dd762002-11-24Marcus Agehall  open(@args);
8f83ac2002-11-24Marcus Agehall  }
94dd762002-11-24Marcus Agehall  }
8f83ac2002-11-24Marcus Agehall  string _sprintf(int t)
94dd762002-11-24Marcus Agehall  {
8f83ac2002-11-24Marcus Agehall  switch(t) { case 'O': return sprintf("Gz.File(/*%s open */)", is_open ? "" : " not"); case 't': return "Gz.File"; default: return ""; }
94dd762002-11-24Marcus Agehall  } int close() { is_open = 0; return ::close(); } void destroy() { close(); } //! @param file //! Filename or filedescriptor of the gzip file to open. //! @param mode //! mode for the file. Defaults to "rb". //! May be one of the following: //! @dl //! @item rb //! read mode //! @item wb //! write mode //! @item ab //! append mode //! @enddl //! For the wb and ab mode, additional parameters may //! be specified. Please se zlib manual for more info. //! @returns //! non-zero if successful. int open(string|int file, void|string mode) { string open_mode="rb";
8f83ac2002-11-24Marcus Agehall  if (is_open) {
94dd762002-11-24Marcus Agehall  ::close();
8f83ac2002-11-24Marcus Agehall  }
94dd762002-11-24Marcus Agehall  if (stringp(mode)) { open_mode = lower_case(mode); } is_open = ::open(file, open_mode); return is_open; } //! Reads data from the file. //! If no argument is given, the whole file is read. int|string read(void|int length) { string ret = "";
8f83ac2002-11-24Marcus Agehall  if (!is_open) {
94dd762002-11-24Marcus Agehall  return 0;
8f83ac2002-11-24Marcus Agehall  }
94dd762002-11-24Marcus Agehall  if (!zero_type(length)) return ::read(length); else while(!eof()) { ret += ::read(1024*64); } return ret; } }