//
// 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.
//
///////////////////////////////////////////////////////////////////////////////
// twadmincl.h -- command line parsing for twadmin
//

#ifndef __TWADMINCL_H
#define __TWADMINCL_H

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

#include "core/error.h"

TSS_EXCEPTION( eTWA,				        eError )
TSS_EXCEPTION( eTWASkippingDirectory,	    eTWA )
TSS_EXCEPTION( eTWAFileNotFound,		    eTWA )
TSS_EXCEPTION( eTWAFileAccess,		        eTWA )
TSS_EXCEPTION( eTWAFileTypeUnknown,		    eTWA )
TSS_EXCEPTION( eTWAInvalidHelpMode,		    eTWA )
TSS_EXCEPTION( eTWADecrypt,	                eTWA )
TSS_EXCEPTION( eTWADecryptCorrupt,          eTWA )

TSS_BEGIN_EXCEPTION_NO_CTOR( eTWAEncryptionChange, eTWA )
    eTWAEncryptionChange( const TSTRING& strMsg1, const TSTRING& strMsg2 = _T(""), uint32 flags = 0)
    : eTWA( strMsg1 + strMsg2, flags ) {} 
TSS_END_EXCEPTION();

TSS_BEGIN_EXCEPTION_NO_CTOR( eTWACreateCfgMissingSitekey,	eTWA )
    eTWACreateCfgMissingSitekey( const TSTRING& msg, uint32 flags = 0 ); 
TSS_END_EXCEPTION();

TSS_BEGIN_EXCEPTION_NO_CTOR( eTWACreateCfgSitekeyMismatch, eTWA )
    eTWACreateCfgSitekeyMismatch( const TSTRING& specifiedKeyfile, const TSTRING& configKeyfile, uint32 flags = 0 ) ;
TSS_END_EXCEPTION();


///////////////////////////////////////////////////////////////////////////////
// cTWAdminCmdLine -- class with a bunch of static member functions helpful in parsing
//		the tripwire command line
///////////////////////////////////////////////////////////////////////////////

class iTWAMode;

class cTWAdminCmdLine
{
public:
	//static void InitCmdLineParser(cCmdLineParser& parser);
		// call this to initialize the command line parser 

	static iTWAMode* GetMode(int argc, const TCHAR *const * argv);
		// this will look at the beginning of the command line, determine the appropriate
		// mode to create, and returns it. If the mode can't be determined, an error message
		// is printed and null is returned.

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

		// modes
		MODE,			// generic -m
		MODE_CREATE_CONFIG,
        MODE_PRINT_CONFIG,
        MODE_CREATE_POLICY,
        MODE_PRINT_POLICY,
        MODE_REMOVE_ENCRYPTION,
        MODE_ENCRYPT,
        MODE_EXAMINE,
        MODE_GENERATE_KEYS,
		MODE_HELP,
		MODE_HELP_ALL,
        MODE_VERSION,

		VERBOSE,
		SILENT,
        NO_BACKUP,
        NO_ENCRYPTION,

		SITE_KEY_FILE,
		LOCAL_KEY_FILE,
        KEY_FILE,
        POL_FILE,
        OUTPUT_FILE,
        PASSPHRASE,
        CFG_FILE,
        SITEPASSPHRASE,
        LOCALPASSPHRASE,

        PARAMS, // the final params

		NUM_CMDLINEARGS
	};
};

///////////////////////////////////////////////////////////////////////////////
// iTWAMode -- 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 cCmdLineParser;
class cConfigFile;
class cErrorQueue;

class iTWAMode
{
public:
	virtual void InitCmdLineParser(cCmdLineParser& cmdLine) = 0;
		// fills out the command line parser with all the switches that are appropriate for 
		// the given mode.
	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! Returns error level to exit with; 0 implies success
    virtual cTWAdminCmdLine::CmdLineArgs GetModeID() const = 0;
        // return MODE_* enumeration coresponding to the current mode.

	virtual TSTRING GetModeUsage( void ) = 0;
		// return a mode-specific usage string ( a subset of the entire usage statement for
		// twadmin

	void SetCfgFilePath( const TSTRING& path ) { mCfgFilePath = path; }
		// if the config file is opened in main(), this should be called so the modes know what the path
		// to the config file is.
	virtual ~iTWAMode() {};
protected:
	TSTRING mCfgFilePath;

};

#endif

