/* -*-Mode: C++;-*-
 * PRCS - The Project Revision Control System
 * Copyright (C) 1997  Josh MacDonald
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * $Id: fileent.h 1.3.1.2.1.12.1.2.1.16 Sun, 28 Oct 2001 00:54:02 -0700 jmacd $
 */


#ifndef _FILEENT_H_
#define _FILEENT_H_

class FileEntry {

public:

    FileEntry (Dstring *working_path,
	       const ListMarker &ent_marker,
	       const PrcsAttrs *attrs,
	       Dstring *desc_ver,
	       Dstring *desc_name,
	       Dstring *link_name,
	       mode_t mode);

    ~FileEntry();

    /* Stat(), set present(), and generate error if the working
     * type is incorrect. */
    PrBoolError  check_working_file();
    PrVoidError  initialize_descriptor(RepEntry* rep,
				       bool regist,
				       bool init_temp_path);
    PrVoidError  get_repository_info(RepEntry* rep_entry);
    PrVoidError  get_file_sys_info();
    NprVoidError stat();

    PrVoidError  chmod(mode_t mode) const;
    PrVoidError  utime(time_t date) const;

    /* Prepare to write prj file */

    void update_repository(RepEntry* rep_entry) const;

    /* Accessors */

    const char* descriptor_version_number() const;
    const char* descriptor_name()           const;
    const char* full_descriptor_name()      const;
    const char* working_path()              const;
    const char* temp_file_path()            const;
    const char* link_name()                 const;
    const char* last_mod_date()             const;
    const char* last_mod_user()             const;

    const ListMarker* ent_marker()  const;

    const PrcsAttrs* file_attrs() const;

    mode_t   file_mode()     const;
    FileType file_type()     const;
    bool     keyword_sub()   const;
    mode_t   stat_mode()     const;
    mode_t   stat_permissions() const;
    off_t    stat_length()   const;
    time_t   stat_mtime()    const;
    ino_t    stat_inode()    const;

    /* Checkin Info */

    bool        unmodified()       const;
    bool        present()          const;
    bool        real_on_cmd_line() const;
    bool        on_command_line()  const;
    bool        empty_descriptor() const;
    int         unkeyed_length()   const;
    const char* checksum()         const;
    int         plus_lines()       const;
    int         minus_lines()      const;

    void set_on_command_line(bool b);
    void set_unmodified(bool b);
    void set_present(bool b);
    void set_checksum(const char* c);
    void set_unkeyed_length(int len);
    void set_file_mode(mode_t mode);
    void set_link_name(const char* c);
    void set_lines (int plus, int minus);
    void set (FileEntry *fe);
    void set_working_path (const char* name);

    void set_version_number(const char* new_version);
    void set_descriptor_name(const char* new_desc);

    void describe (Dstring &ds);

    ProjectDescriptor *project() const;

private:

    mode_t _stat_mode;
    time_t _stat_mtime;
    off_t  _stat_size;
    ino_t  _stat_ino;
    uid_t  _stat_uid;
    long _unkeyed_length;
    char _checksum[16];        /* You can get rid of this, except its 104 bytes
				* before removal, and probably won't save anything. */
    bool _unmodified;          /* True if this file is known to be unmodified from its predecessor. */
    bool _present;

    int _plus_lines;
    int _minus_lines;

    mode_t   _file_mode;
    bool _on_command_line;     /* true if this file was selected */

    ListMarker _ent_marker;

    /* set by a call to get_{filesys,repository}_info() */
    Dstring *_user;
    Dstring *_date;

    /* set if :symlink when read, otherwise in check_working_file() */
    Dstring *_link_name;

    /* set when read */
    Dstring *_work_path;
    Dstring *_rcs_version_string;
    Dstring *_descriptor_name;

    /* set by initialize_descriptor */
    Dstring *_temp_path;
    Dstring *_full_rep_path;

    /* Attrsibutes shared by many files. */
    const PrcsAttrs *_attrs;
};

void describe_versionfile (const char* file, RcsVersionData *ver, Dstring &ds);

#endif /* FILEENT_H */
