//
// The developer of the original code and/or files is Tripwire, Inc.
// Portions created by Tripwire, Inc. are copyright (C) 2000 Tripwire,
// Inc. Tripwire is a registered trademark of Tripwire, Inc.  All rights
// reserved.
// 
// This program is free software.  The contents of this file are subject
// to 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.  You may redistribute it and/or modify it
// only in compliance with the GNU General Public License.
// 
// This program is distributed in the hope that it will be useful.
// However, this program is distributed AS-IS WITHOUT ANY
// WARRANTY; INCLUDING THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS
// FOR A PARTICULAR PURPOSE.  Please 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// 
// Nothing in the GNU General Public License or any other license to use
// the code or files shall permit you to use Tripwire's trademarks,
// service marks, or other intellectual property without Tripwire's
// prior written consent.
// 
// If you have any questions, please contact Tripwire, Inc. at either
// info@tripwire.org or www.tripwire.org.
//
///////////////////////////////////////////////////////////////////////////////
// twprintcmdline.h
// 
// cTWPrintCmdLine	-- holds all information on twprint's command line
// iTWMode		-- abstract base class for a mode of operation in tripwire
#ifndef __TWPRINTCMDLINE_H
#define __TWPRINTCMDLINE_H

#ifndef __TCHAR_H
#include "tchar.h"
#endif

class cConfigFile;
class cCmdLineParser;
class cErrorQueue;
class cErrorBucket;
class iTWMode;

TSS_EXCEPTION( eTWPrintInvalidParamHelp,		eError )
TSS_EXCEPTION( eTWPrintInvalidReportLevel,		eError )
TSS_EXCEPTION( eTWPrintInvalidReportLevelCfg,	eError )

// Help is requested for a non-existent mode.

///////////////////////////////////////////////////////////////////////////////
// cTWPrintCmdLine -- class with a bunch of static member functions helpful in parsing
//		the tripwire command line
///////////////////////////////////////////////////////////////////////////////
class cTWPrintCmdLine
{
public:
	static iTWMode* GetMode(int argc, const	TCHAR* const* argv);
		// after the command line has been read, call this to extract the mode information
		// from the command line, create an iTWMode-derived class, and return it. If this 
		// fails, it will print the error message to stderr and return NULL.

	// constants for all the command line arguments
	enum CmdLineArgs
	{
        HELP,

		// modes
		MODE,			// generic -m
		MODE_DBPRINT,		
		MODE_REPORTPRINT,
		MODE_HELP,
		MODE_HELP_ALL,

		VERBOSE,
		SILENT,

		CFG_FILE,
		LOCAL_KEY_FILE,
        SITE_KEY_FILE,

		DB_FILE,
		REPORT_FILE,

		PASSPHRASE,
		REPORTLEVEL,

		PARAMS,			// the final parameters

		NUM_CMDLINEARGS
	};
};

///////////////////////////////////////////////////////////////////////////////
// iTWMode -- base class that contains an interface for initializing tripwire 
//		in a mode of operation and executing in that mode; a class is derived
//		from this for each mode of operation
///////////////////////////////////////////////////////////////////////////////
class iTWMode
{
public:

	virtual void InitCmdLineParser(cCmdLineParser& parser) = 0;
		// call this to initialize the command line parser. All modes must override this
		// method.  A static function will be made to initialize the cmdline with parameters
		// common to all modes.
	virtual bool Init(const cConfigFile& cf, const cCmdLineParser& cmdLine) = 0;
		// call this to ask the mode object to initialize all of its data structures
		// with the passed in information. If it returns false, it can be assumed that an error
		// message was spit to stderr.
	virtual int Execute(cErrorQueue* pQueue) = 0;
		// go to work! TODO -- I don't know how errors (or return values) should be conveyed
		// I think that maybe this guy should return an int indicating the return value
	virtual TSTRING GetModeUsage( void ) = 0;
		// Returns a TSTRING that describes specific usage for a derived mode.
	virtual cTWPrintCmdLine::CmdLineArgs GetModeID() = 0;
    virtual void SetConfigFile( TSTRING configFilePath ) = 0;
};

///////////////////////////////////////////////////////////////////////////////
// Report Printing
///////////////////////////////////////////////////////////////////////////////
class cTWPrintReportMode_i;
class cTWPrintReportMode : public iTWMode
{
public:
	cTWPrintReportMode();
	virtual ~cTWPrintReportMode();

    
    void FillOutReportModeConfigInfo(cTWPrintReportMode_i* pModeInfo, const cConfigFile& cf);
	
	virtual void	InitCmdLineParser( cCmdLineParser& parser);
	virtual bool	Init	(const cConfigFile& cf, const cCmdLineParser& cmdLine);
	virtual int		Execute	(cErrorQueue* pQueue);
	virtual TSTRING GetModeUsage();
	virtual cTWPrintCmdLine::CmdLineArgs GetModeID() { return cTWPrintCmdLine::MODE_DBPRINT; }
    virtual void    SetConfigFile( TSTRING configFilePath );
private:
	cTWPrintReportMode_i* mpData;	
};

///////////////////////////////////////////////////////////////////////////////
// Database Printing
///////////////////////////////////////////////////////////////////////////////
class cTWPrintDBMode_i;
class cTWPrintDBMode : public iTWMode
{
public:
	cTWPrintDBMode();
	virtual ~cTWPrintDBMode();

    void FillOutDBModeConfigInfo(cTWPrintDBMode_i* pModeInfo, const cConfigFile& cf);
	
	virtual void	InitCmdLineParser( cCmdLineParser& parser);
	virtual bool	Init	(const cConfigFile& cf, const cCmdLineParser& cmdLine);
	virtual int		Execute	(cErrorQueue* pQueue);	
	virtual TSTRING GetModeUsage();
	virtual cTWPrintCmdLine::CmdLineArgs GetModeID() { return cTWPrintCmdLine::MODE_REPORTPRINT; }
    virtual void    SetConfigFile( TSTRING configFilePath );
private:
	cTWPrintDBMode_i* mpData;	
};

///////////////////////////////////////////////////////////////////////////////
// Help Mode - a means for emitting mode-specific help.
///////////////////////////////////////////////////////////////////////////////
class cTWPrintHelpMode_i;
class cTWPrintHelpMode : public iTWMode
{
public:
	cTWPrintHelpMode();
	virtual ~cTWPrintHelpMode();
	
	virtual void	InitCmdLineParser(cCmdLineParser& cmdLine);
	virtual bool	Init	(const cConfigFile& cf, const cCmdLineParser& cmdLine);
	virtual int		Execute	(cErrorQueue* pQueue);	
	virtual TSTRING GetModeUsage() { return _T(""); }
	virtual cTWPrintCmdLine::CmdLineArgs GetModeID() { return cTWPrintCmdLine::MODE_HELP; }
    virtual void    SetConfigFile( TSTRING configFilePath );
private:
	cTWPrintHelpMode_i* mpData;	
};



#endif// TWPRINTCMDLINE

