94dd762002-11-24Marcus Agehall // $Id: module.pmod.in,v 1.1 2002/11/24 21:06:09 agehall Exp $ #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; private int is_open; //! @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(); if(sizeof(args)) open(@args); } string _sprintf() { return sprintf("GZipFile(/*%s open */)", is_open ? "" : " not"); } 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"; if (is_open) ::close(); 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 = ""; if (!is_open) return 0; if (!zero_type(length)) return ::read(length); else while(!eof()) { ret += ::read(1024*64); } return ret; } }