1 //  This file is part of par2cmdline (a PAR 2.0 compatible file verification and
2 //  repair tool). See http://parchive.sourceforge.net for details of PAR 2.0.
3 //
4 //  Copyright (c) 2003 Peter Brian Clements
5 //
6 //  par2cmdline is free software; you can redistribute it and/or modify
7 //  it under the terms of the GNU General Public License as published by
8 //  the Free Software Foundation; either version 2 of the License, or
9 //  (at your option) any later version.
10 //
11 //  par2cmdline is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
19 
20 #ifndef __COMMANDLINE_H__
21 #define __COMMANDLINE_H__
22 
23 // The CommandLine object is responsible for understanding the format
24 // of the command line parameters are parsing the command line to
25 // extract details as to what the user wants to do.
26 
27 class CommandLine
28 {
29 public:
30   CommandLine(void);
31 
32   // Parse the supplied command line arguments.
33   bool Parse(int argc, char *argv[]);
34 
35   // Display details of the correct format for command line parameters.
36   static void usage(void);
37 
38   // What operation will we be carrying out
39   typedef enum
40   {
41     opNone = 0,
42     opCreate,        // Create new PAR2 recovery volumes
43     opVerify,        // Verify but don't repair damaged data files
44     opRepair         // Verify and if possible repair damaged data files
45   } Operation;
46 
47   typedef enum
48   {
49     verUnknown = 0,
50     verPar1,         // Processing PAR 1.0 files
51     verPar2          // Processing PAR 2.0 files
52   } Version;
53 
54   typedef enum
55   {
56     scUnknown = 0,
57     scVariable,      // Each PAR2 file will have 2x as many blocks as previous
58     scLimited,       // Limit PAR2 file size
59     scUniform        // All PAR2 files the same size
60   } Scheme;
61 
62   typedef enum
63   {
64     nlUnknown = 0,
65     nlSilent,       // Absolutely no output (other than errors)
66     nlQuiet,        // Bare minimum of output
67     nlNormal,       // Normal level of output
68     nlNoisy,        // Lots of output
69     nlDebug         // Extra debugging information
70   } NoiseLevel;
71 
72   // Any extra files listed on the command line
73   class ExtraFile
74   {
75   public:
76     ExtraFile(void);
77     ExtraFile(const ExtraFile&);
78     ExtraFile& operator=(const ExtraFile&);
79 
80     ExtraFile(const string &name, u64 size);
81 
FileName(void)82     string FileName(void) const {return filename;}
FileSize(void)83     u64 FileSize(void) const {return filesize;}
84 
85   protected:
86     string filename;
87     u64    filesize;
88   };
89 
90 public:
91   // Accessor functions for the command line parameters
92 
GetOperation(void)93   CommandLine::Operation GetOperation(void) const          {return operation;}
GetVersion(void)94   CommandLine::Version   GetVersion(void) const            {return version;}
GetBlockSize(void)95   u64                    GetBlockSize(void) const          {return blocksize;}
GetBlockCount(void)96   u32                    GetBlockCount(void) const         {return blockcount;}
GetRedundancy(void)97   u32                    GetRedundancy(void) const         {return redundancy;}
GetFirstRecoveryBlock(void)98   u32                    GetFirstRecoveryBlock(void) const {return firstblock;}
GetRecoveryFileCount(void)99   u32                    GetRecoveryFileCount(void) const  {return recoveryfilecount;}
GetRecoveryBlockCount(void)100   u32                    GetRecoveryBlockCount(void) const {return recoveryblockcount;}
GetRecoveryFileScheme(void)101   CommandLine::Scheme    GetRecoveryFileScheme(void) const {return recoveryfilescheme;}
GetMemoryLimit(void)102   size_t                 GetMemoryLimit(void) const        {return memorylimit;}
GetLargestSourceSize(void)103   u64                    GetLargestSourceSize(void) const  {return largestsourcesize;}
GetTotalSourceSize(void)104   u64                    GetTotalSourceSize(void) const    {return totalsourcesize;}
GetNoiseLevel(void)105   CommandLine::NoiseLevel GetNoiseLevel(void) const        {return noiselevel;}
106 
GetParFilename(void)107   string                              GetParFilename(void) const {return parfilename;}
GetExtraFiles(void)108   const list<CommandLine::ExtraFile>& GetExtraFiles(void) const  {return extrafiles;}
109 
110 protected:
111   Operation operation;         // The operation to be carried out.
112   Version version;             // What version files will be processed.
113 
114   NoiseLevel noiselevel;       // How much display output should there be.
115 
116   u32 blockcount;              // How many blocks the source files should
117                                // be virtually split into.
118 
119   u64 blocksize;               // What virtual block size to use.
120 
121   u32 firstblock;              // What the exponent value for the first
122                                // recovery block will be.
123 
124   Scheme recoveryfilescheme;   // How the the size of the recovery files should
125                                // be calculated.
126 
127   u32 recoveryfilecount;       // How many recovery files should be created.
128 
129   u32 recoveryblockcount;      // How many recovery blocks should be created.
130   bool recoveryblockcountset;  // Set if the recoveryblockcount as been specified
131 
132   u32 redundancy;              // What percentage of recovery data should
133                                // be created.
134   bool redundancyset;          // Set if the redundancy has been specified
135 
136   string parfilename;          // The name of the PAR2 file to create, or
137                                // the name of the first PAR2 file to read
138                                // when verifying or repairing.
139 
140   list<ExtraFile> extrafiles;  // The list of other files specified on the
141                                // command line. When creating, this will be
142                                // the source files, and when verifying or
143                                // repairing, this will be additional PAR2
144                                // files or data files to be examined.
145 
146   u64 totalsourcesize;         // Total size of the source files.
147 
148   u64 largestsourcesize;       // Size of the largest source file.
149 
150   size_t memorylimit;          // How much memory is permitted to be used
151                                // for the output buffer when creating
152                                // or repairing.
153 };
154 
155 typedef list<CommandLine::ExtraFile>::const_iterator ExtraFileIterator;
156 
157 #endif // __COMMANDLINE_H__
158