Files
mars-flaim/flaim/util/dbshell.h
ahodgkinson f54e6ce080 Changed license to LGPL.
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@1009 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2007-01-23 09:38:48 +00:00

638 lines
13 KiB
C++

//------------------------------------------------------------------------------
// Desc: Command-line environment for FLAIM utilities
//
// Tabs: 3
//
// Copyright (c) 1999-2007 Novell, Inc. All Rights Reserved.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; version 2.1
// of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com.
//
// $Id$
//------------------------------------------------------------------------------
#ifndef DBSHELL_H
#define DBSHELL_H
#include "flaimsys.h"
#include "sharutil.h"
// Types of clipboard data
enum eClipboardDataType
{
CLIPBOARD_EMPTY,
CLIPBOARD_GEDCOM,
CLIPBOARD_TEXT
};
typedef enum eClipboardDataType ClipboardDataType;
class FlmShell;
/*===========================================================================
struct: DB_CONTEXT
Desc: This structure contains information for a particular database.
===========================================================================*/
typedef struct DBContextTag
{
HFDB hDb;
FLMUINT uiCurrContainer;
FLMUINT uiCurrIndex;
FLMUINT uiCurrId;
FLMUINT uiCurrSearchFlags;
} DB_CONTEXT;
/*===========================================================================
Desc: This class is used by the shell to perform commands it has parsed.
===========================================================================*/
class FlmCommand : public F_Object
{
public:
FlmCommand( void){}
virtual ~FlmCommand( void) {}
// Methods that must be implemented in classes that extend this class.
virtual FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell) = 0;
virtual void displayHelp(
FlmShell * pShell,
char * pszCommand) = 0;
virtual FLMBOOL canPerformCommand(
char * pszCommand) = 0;
};
/*===========================================================================
Desc: This class manages a database context - FLAIM session and #N
open databases.
===========================================================================*/
class FlmDbContext : public F_Object
{
#define MAX_DBCONTEXT_OPEN_DB 9
public:
FlmDbContext( void);
~FlmDbContext( void);
FINLINE FLMUINT getCurrDbId(
void)
{
return m_uiCurrDbId;
}
FINLINE void setCurrDbId(
FLMUINT uiDbId)
{
if (uiDbId < MAX_DBCONTEXT_OPEN_DB)
{
m_uiCurrDbId = uiDbId;
}
}
FLMBOOL getAvailDbId(
FLMUINT * puiDbId);
FLMBOOL setDb(
FLMUINT uiDbId,
HFDB hDb);
HFDB getDb(
FLMUINT uiDbId);
FLMBOOL setCurrContainer(
FLMUINT uiDbId,
FLMUINT uiContainer);
FLMUINT getCurrContainer(
FLMUINT uiDbId);
FLMBOOL setCurrIndex(
FLMUINT uiDbId,
FLMUINT uiIndex);
FLMUINT getCurrIndex(
FLMUINT uiDbId);
FLMBOOL setCurrId(
FLMUINT uiDbId,
FLMUINT uiId);
FLMUINT getCurrId(
FLMUINT uiDbId);
FLMBOOL setCurrSearchFlags(
FLMUINT uiDbId,
FLMUINT uiSearchFlags);
FLMUINT getCurrSearchFlags(
FLMUINT uiDbId);
private:
FLMUINT m_uiCurrDbId;
DB_CONTEXT m_DbContexts [MAX_DBCONTEXT_OPEN_DB];
};
/*===========================================================================
Desc: This class parses a command line
===========================================================================*/
class FlmParse : public F_Object
{
public:
FlmParse( void);
~FlmParse( void)
{
}
void setString(
char * pszString);
char * getNextToken( void);
private:
char m_szString[ 512];
char m_szToken[ 512];
char * m_pszCurPos;
};
/*===========================================================================
Desc: This class manages a command-line shell
===========================================================================*/
class FlmShell : public F_Object
{
public:
FlmShell();
virtual ~FlmShell();
RCODE setup( void);
// Methods that are invoked by the command objects
RCODE registerDatabase(
HFDB hDb,
FLMUINT * puiDbId);
RCODE getDatabase(
FLMUINT uiDbId,
HFDB * phDb);
RCODE deregisterDatabase(
FLMUINT uiDbId);
void con_printf(
const char * pszFormat, ...);
FINLINE void displayCommand(
const char * pszCommand,
const char * pszDescription)
{
con_printf( " %-20s -- %s\n", pszCommand, pszDescription);
}
RCODE execute( void);
RCODE registerCmd(
FlmCommand * pCmd);
RCODE addCmdHistory(
char * pszCmd);
FINLINE char * getOutputFileName( void)
{
return m_pszOutputFile;
}
FINLINE void setScreen(
FTX_SCREEN * pScreen)
{
m_pScreen = pScreen;
}
FINLINE FTX_SCREEN * getScreen( void)
{
return( m_pScreen);
}
FINLINE void setWindow(
FTX_WINDOW * pWindow)
{
m_pWindow = pWindow;
}
FINLINE FTX_WINDOW * getWindow( void)
{
return( m_pWindow);
}
private:
#define MAX_SHELL_OPEN_DB 10
#define MAX_SHELL_HISTORY_ITEMS 5
#define MAX_REGISTERED_COMMANDS 50
#define MAX_CMD_LINE_LEN 256
#define MAX_THREAD_NAME_LEN 64
FTX_SCREEN * m_pScreen;
FTX_WINDOW * m_pWindow;
FTX_WINDOW * m_pTitleWin;
HFDB m_DbList[ MAX_SHELL_OPEN_DB];
F_Pool m_ArgPool;
FLMINT m_iCurrArgC;
char ** m_ppCurrArgV;
char * m_pszOutputFile;
FLMINT m_iLastCmdExitCode;
FLMBOOL m_bPagingEnabled;
FlmCommand * m_ppCmdList[ MAX_REGISTERED_COMMANDS];
char * m_ppHistory[ MAX_SHELL_HISTORY_ITEMS];
// Private methods
RCODE parseCmdLine(
char * pszString);
RCODE executeCmdLine( void);
RCODE selectCmdLineFromList( // Pops up a selection list and allows
// the user to choose a command line
// from the history list
char * pszCmdLineRV);
};
/*===========================================================================
Desc: This class implements the database open command
===========================================================================*/
class FlmDbOpenCommand : public FlmCommand
{
public:
FlmDbOpenCommand( void) {}
~FlmDbOpenCommand( void) {}
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc: This class implements the database close command
===========================================================================*/
class FlmDbCloseCommand : public FlmCommand
{
public:
FlmDbCloseCommand( void) {}
~FlmDbCloseCommand( void) {}
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc: This class implements the trans command (for transactions)
===========================================================================*/
class FlmTransCommand : public FlmCommand
{
public:
FlmTransCommand( void) {}
~FlmTransCommand( void) {}
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc: This class implements the dbCopy, dbRename, and dbRemove commands.
==========================================================================*/
class FlmDbManageCommand : public FlmCommand
{
public:
FlmDbManageCommand( void) {}
~FlmDbManageCommand( void) {}
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc: This class implements the backup command (FlmDbBackup)
===========================================================================*/
class FlmBackupCommand : public FlmCommand
{
public:
FlmBackupCommand( void) {}
~FlmBackupCommand( void) {}
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc: This class implements the restore command (FlmDbRestore)
===========================================================================*/
class FlmRestoreCommand : public FlmCommand
{
public:
FlmRestoreCommand( void) {}
~FlmRestoreCommand( void) {}
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc:
===========================================================================*/
class FlmDbConfigCommand : public FlmCommand
{
public:
FlmDbConfigCommand( void) {}
~FlmDbConfigCommand( void) {}
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc:
===========================================================================*/
class FlmDbGetConfigCommand : public FlmCommand
{
public:
FlmDbGetConfigCommand( void) {}
~FlmDbGetConfigCommand( void) {}
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc: This class implements the file system command.
===========================================================================*/
class FlmFileSysCommand : public FlmCommand
{
public:
FlmFileSysCommand( void)
{
}
~FlmFileSysCommand( void)
{
}
// Methods that must be implemented in classes that extend this class.
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc: This class implements the file delete command.
===========================================================================*/
class FlmEditCommand : public FlmCommand
{
public:
FlmEditCommand( void)
{
}
~FlmEditCommand( void)
{
}
// Methods that must be implemented in classes that extend this class.
FLMINT execute(
FLMINT iArgC,
char ** ppszArgV,
FlmShell * pShell);
void displayHelp(
FlmShell * pShell,
char * pszCommand);
FLMBOOL canPerformCommand(
char * pszCommand);
private:
};
/*===========================================================================
Desc:
===========================================================================*/
class DirectoryIterator
{
public:
DirectoryIterator()
{
m_bInitialized = FALSE;
m_pszBaseDir = NULL;
m_pszExtendedDir = NULL;
m_pszResolvedDir = NULL;
m_pDirHdl = NULL;
m_ppszMatchList = NULL;
m_uiCurrentMatch = 0;
m_uiTotalMatches = 0;
}
~DirectoryIterator()
{
reset();
}
FINLINE char * getResolvedPath()
{
return m_pszResolvedDir;
}
void reset();
RCODE setupForSearch(
IF_FileSystem * pFileSystem,
char * pszBaseDir,
char * pszExtendedDir,
char * pszPattern);
FINLINE FLMBOOL isInitialized()
{
return m_bInitialized;
}
void next(
char * pszReturn,
FLMBOOL bCompletePath);
void prev(
char * pszReturn,
FLMBOOL bCompletePath);
void first(
char * pszReturn,
FLMBOOL bCompletePath);
void last(
char * pszReturn,
FLMBOOL bCompletePath);
FLMBOOL isInSet(
char * pszFilename);
FINLINE FLMBOOL isEmpty( void)
{
return m_uiTotalMatches == 0;
}
private:
enum {MAX_PATH_SIZE = 640};
RCODE setupDirectories(
char * pszBaseDir,
char * pszExtendedDir);
static FINLINE FLMBOOL isQuoted(
char * pszString)
{
return pszString[0] == '\"' &&
pszString[ f_strlen( pszString) - 1] == '\"';
}
FLMBOOL isDriveSpec(
char * pszPath);
RCODE extractRoot(
char * pszPath,
char * pszRoot);
RCODE resolveDir( void);
FLMBOOL m_bInitialized;
char * m_pszBaseDir;
char * m_pszExtendedDir;
char * m_pszResolvedDir;
IF_DirHdl * m_pDirHdl;
char ** m_ppszMatchList;
FLMUINT m_uiCurrentMatch;
FLMUINT m_uiTotalMatches;
};
#endif // #ifndef DBSHELL_H