tripwire-open-source/src/core/package.h

211 lines
7.6 KiB
C++

//
// The developer of the original code and/or files is Tripwire, Inc.
// Portions created by Tripwire, Inc. are copyright (C) 2000-2018 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.
//
//
// Name....: package.h
// Date....: 05/08/99
// Creator.: Robert DiFalco (rdifalco)
//
// These classes and macros make up the TSS package abstraction.
//
// In TSS, a package represent a single project file. This file
// can represent a LIB, DLL, EXE, or other source code "package".
// The package _classes_, work together to provide a single point
// of entry for all the resources a Package (such as a LIB of DLL
// module) wish to make available to itself and other packages.
// A typical example (in fact so typical that it is concretely
// modeled in the Package abstraction) are shared Message strings.
// Each package has a message table that can be accessed by other
// packages that cooperate in the same application.
//
// The major components of packaging are the package wrapper (or
// singleton) and the package representation. There may only be
// one copy of the package representation. Its members may be
// themselves singletons or shared. Using the package interface
// guarantees that all shared resources will be properely
// initialized before they are used. When creating a package
// representation you can declare other packages that your
// package depends on, ensuring that predicate packages and their
// resources will be initialized before the package that uses
// those resources.
//
// Contents of this File
//
// TSS_Package( cPackage )
// TSS_BeginPackage( cPackage )
// TSS_EndPackage( cPackage )
// TSS_ImplementPackage( cPackage )
// TSS_Dependency( cPackage )
//
// TSS_DECLARE_STRINGTABLE
// TSS_GetString( cPackage, IDS )
//
// TSS_BeginStringtable( cPackage )
// TSS_StringEntry( IDS, "message" )
// TSS_EndStringtable( cPackage )
//
// TSS_BeginStringIds( package_namespace )
// TSS_EndStringIds( package_namespace )
//
// class cPackageBase_<CharT>
// class cPackage_<cPackage>
//
#ifndef __PACKAGE_H
#define __PACKAGE_H
#include "resources.h" // for: cMessage_<KEY,CHAR>
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Macro helpers
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//--PACKAGE Helpers
#define TSS_Package(pkg) pkg::GetInstance() // Access "the" Package obj
#define TSS_Dependency(pkg) TSS_Package(pkg) // Declare a Package Depend.
#define TSS_BeginPackage(pkg) \
class pkg : public cPackageBase_<TCHAR> \
{ \
public: \
static pkg& GetInstance();
#define TSS_EndPackage(pkg) \
} \
;
#define TSS_ImplementPackage(pkg) \
pkg& pkg::GetInstance() \
{ \
static bool bConstructed = false; \
static pkg x; \
if (!bConstructed) \
{ \
bConstructed = true; \
x.LoadStrings(); \
} \
return x; \
}
//--STRINGTABLE Helperfs
#define TSS_GetString(pkg, id) TSS_Package(pkg).GetString(id) // Access the Message String
#define TSS_DECLARE_STRINGTABLE \
public: \
Messages::String GetString(Messages::ConstKeyRef id) const \
{ \
return m_messages.Get(id); \
} \
void LoadStrings(); \
\
private: \
Messages m_messages // Decare a Stringtable
#ifdef DEBUG
# define TSS_BeginStringtable(pkg) \
void pkg::LoadStrings() \
{ \
cDebug d(#pkg "::LoadStrings()"); \
d.TraceDebug("Loading strings for " #pkg " package.\n"); \
Messages::Pair astr[] = { // Define a Stringtable
#else // DEBUG
# define TSS_BeginStringtable(pkg) \
void pkg::LoadStrings() \
{ \
Messages::Pair astr[] = { // Define a Stringtable
#endif // DEBUG
#define TSS_EndStringtable(pkg) \
} \
; \
m_messages.Put(astr, astr + countof(astr)); \
} // End define Strintable
#define TSS_StringEntry(id, s) Messages::Pair(id, s) // Stringtable Entry
#define TSS_BeginStringIds(pns) \
namespace pns \
{ \
enum \
{ // Define String IDs
#define TSS_EndStringIds(pns) \
} \
; \
} // End define String IDs
//=============================================================================
// cPackageBase_<CharT> -- Base class for all Package Resources
//-----------------------------------------------------------------------------
// SYNOPSIS:
// This class is the base class for all package representations
// and, thus, establishes the package contract. It's interface
// is relied on by the Package singleton wrapper, TSS_Package.
// Since part of its contract is that there is only one package
// instance per package, none of its data members need be static
// allowing the client to assume that its constructor will only
// be called once.
//
// CONSTRAINTS:
// A Package representation template must be instantiated with a
// "character concept" that is a valid STDCPP NTCTS.
// This will most often be char (for NTBS), wchar_t (for NTWCS),
// but may also be unsigned char (for NTMBCS).
//
// INVARIANTS:
// m_nInstances <= 1
//
//
template<class CharT> class cPackageBase_
{
public:
typedef cMessages_<int, CharT> Messages;
void LoadStrings()
{
}
};
#endif //__PACKAGE_H