1 #ifndef FILE_INFO_CLASS
2 #define FILE_INFO_CLASS
4 /*****************************************************************************\
7 * Author : Chris Koeritz *
9 *******************************************************************************
10 * Copyright (c) 1993-$now By Author. This program is free software; you can *
11 * redistribute it and/or modify it under the terms of the GNU General Public *
12 * License as published by the Free Software Foundation; either version 2 of *
13 * the License or (at your option) any later version. This is online at: *
14 * http://www.fsf.org/copyleft/gpl.html *
15 * Please send any updates to: fred@gruntose.com *
16 \*****************************************************************************/
19 #include "file_time.h"
21 #include <basis/definitions.h>
22 #include <basis/enhance_cpp.h>
24 namespace filesystem {
26 //! Encapsulates some measures and calculations based on a file's contents.
28 class file_info : public filename
31 //! this enum encapsulates how files may be compared.
32 enum file_similarity {
33 EQUAL_NAME = 0, // we assume name equality is pre-eminent and always required.
34 EQUAL_CHECKSUM = 0x1, // the files have the same checksum, however computed.
35 EQUAL_TIMESTAMP = 0x2, // the files have exactly equal timestamps.
36 EQUAL_FILESIZE = 0x4, // the files have the same sizes.
37 EQUAL_CHECKSUM_TIMESTAMP_FILESIZE = EQUAL_CHECKSUM & EQUAL_TIMESTAMP & EQUAL_FILESIZE
40 double _file_size; //!< the size of the file.
41 file_time _time; //!< the file's access time.
42 int _checksum; //!< the checksum for the file.
44 file_info(); //!< blank constructor.
46 file_info(const filename &to_copy, double file_size,
47 const file_time &time = file_time(), int checksum = 0);
48 //!< to get the real file size, timestamp and checksum, invoke the calculate method.
50 file_info(const file_info &to_copy);
54 DEFINE_CLASS_NAME("file_info");
56 file_info &operator = (const file_info &to_copy);
58 basis::astring text_form() const;
60 bool calculate(const basis::astring &prefix, bool just_size_n_time,
61 int checksum_edge = 1 * basis::KILOBYTE);
62 //!< fills in the correct file size and checksum information for this file.
63 /*!< note that the file must exist for this to work. if "just_size_n_time"
64 is true, then the checksum is not calculated. if the "prefix" is not
65 empty, then it is used as a directory path that needs to be added to
66 the filename to make it completely valid. this is common if the
67 filename is stored relative to a path. the "checksum_edge" is used for
68 checksum calculations; only 2 * checksum_edge bytes will be factored in,
69 each part from the head and tail ends of the file. */
71 const basis::astring &secondary() const;
72 //!< observes the alternate form of the name.
73 void secondary(const basis::astring &new_sec);
74 //!< accesses the alternate form of the name.
76 const basis::byte_array &attachment() const;
77 //!< returns the chunk of data optionally attached to the file's info.
78 /*!< this supports extending the file's record with extra data that might
79 be needed during processing. */
80 void attachment(const basis::byte_array &new_attachment);
81 //!< sets the optional chunk of data hooked up to the file's info.
83 // standard streaming operations.
84 virtual int packed_size() const;
85 virtual void pack(basis::byte_array &packed_form) const;
86 virtual bool unpack(basis::byte_array &packed_form);
89 basis::astring c_secondary; //!< alternate filename for the main one.
90 basis::byte_array c_attachment; //!< extra information, if needed.