1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2006-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 //
6 // Any parts of this program derived from the xMule, lMule or eMule project,
7 // or contributed by third-party developers are copyrighted by their
8 // respective authors.
9 //
10 // This program is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 2 of the License, or
13 // (at your option) any later version.
14 //
15 // This program is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
23 //
24 
25 #ifndef TEXTFILE_H
26 #define TEXTFILE_H
27 
28 #include <wx/ffile.h>
29 #include <wx/string.h>
30 #include <wx/strconv.h>
31 
32 
33 class CPath;
34 
35 /** Criteria used when reading an entire file to an array of strings. */
36 enum EReadTextFile
37 {
38 	/** Do not filter anything */
39 	txtReadAll = 0,
40 	/** Do not return empty lines. Can be combined with txtStripWhiteSpace */
41 	txtIgnoreEmptyLines = 1,
42 	/** Do not return lines starting with a '#' */
43 	txtIgnoreComments = 2,
44 	/** Strip whitespace from the beginning/end of lines. */
45 	txtStripWhitespace = 4,
46 
47 	/** Default parameters for file reading. */
48 	txtReadDefault = txtIgnoreEmptyLines | txtIgnoreComments | txtStripWhitespace
49 };
50 
51 
52 /**
53  * Text file class.
54  *
55  * This class is a wrapper around wxFFile, letting an text file be read
56  * or written line-by-line. The class provides transparent and automatic
57  * EOL-style handling.
58  *
59  * Note that it is not possible to seek in a CTextFile, only sequential
60  * reading or writing is possible. Also note that the maximum length of a
61  * line is fixed (see CTextFile::GetNextLine), however this shouldn't be
62  * a problem, given the uses of this class.
63  */
64 class CTextFile
65 {
66 public:
67 	// Open modes. Note that these are mutually exclusive!
68 	enum EOpenMode {
69 		//! Opens the file for reading, if it exists.
70 		read,
71 		//! Opens the file for writing, overwriting old contents.
72 		write
73 	};
74 
75 	/* Constructor. */
76 	CTextFile();
77 	/** Destructor. Closes the file if still open. */
78 	~CTextFile();
79 
80 	/** Opens the specified file, returning true on success. */
81 	//\{
82 	bool Open(const wxString& path, EOpenMode mode);
83 	bool Open(const CPath& path, EOpenMode mode);
84 	//\}
85 
86 	/** Returns true if the file is opened. */
87 	bool		IsOpened() const;
88 	/** Returns true if GetNextLine has reached the end of the file. */
89 	bool		Eof() const;
90 	/** Closes the file, returning true on success. */
91 	bool		Close();
92 
93 
94 	/**
95 	 * Returns the next line of a readable file.
96 	 *
97 	 * @param conv The converter used to convert from multibyte to widechar.
98 	 *
99 	 * Note that GetNextLine will return an empty string if the file has reached
100 	 * EOF, or if the file is closed, or not readable. However, empty lines in
101 	 * the file will also be returned unless otherwise specified, so this cannot be used to test for EOF.
102 	 * Instead, use the function Eof().
103 	 **/
104 	wxString	GetNextLine(EReadTextFile flags = txtReadAll, const wxMBConv& conv = wxConvLibc, bool* result = NULL);
105 
106 	/**
107 	 * Writes the line to a writable file, returning true on success.
108 	 *
109 	 * @param conv The converter used to convert from widechar to multibyte.
110 	 */
111 	bool		WriteLine(const wxString& line, const wxMBConv& conv = wxConvLibc);
112 
113 
114 	/** Reads and returns the contents of a text-file, using the specifed criteria and converter. */
115 	wxArrayString ReadLines(EReadTextFile flags = txtReadDefault, const wxMBConv& conv = wxConvLibc);
116 
117 	/** Writes the lines to the file, using the given converter, returning true if no errors occured. */
118 	bool WriteLines(const wxArrayString& lines, const wxMBConv& conv = wxConvLibc);
119 
120 private:
121 	//! The actual file object.
122 	wxFFile		m_file;
123 	//! The mode in with which the file was opened.
124 	EOpenMode	m_mode;
125 };
126 
127 #endif /* TEXTFILE_H */
128