class TCoolSoftCADLicenseUse : public TLicenseUse {
// Copyright (C) 1995 Taligent, Inc. All rights reserved.
public:
//.................................................................
// Constructors and destructors.
TCoolSoftCADLicenseUse();
virtual ~TCoolSoftCADLicenseUse();
protected:
//.................................................................
// SelectProvider is for provider prioritization.
virtual voidSelectProvider(TLicenseProduct& selection, const TCollectionOf<TLicenseProduct>& providers);
//.................................................................
// GetOperations and AcceptOperationsResults are for challenge negotiation.
virtual voidGetOperations (const TLicenseProduct& theProviderProduct,
TCollectionOf<TProviderOperation>& operations);
virtual voidAcceptOperationsResults(const TLicenseProduct& theProviderProduct,
const TCollectionOf<TProviderOperation>& operations);
//.................................................................
// ReportException is called before throwing an exception to the
// caller (product calling Check()).
virtual voidReportException(const TStandardException& exception);
};
#define kCoolSoftVendorId "OID: 1.3.6.1.4.1.63"
#define kCoolSoftVendorContact "\
Cool Software, Inc.\n\
1234 Street\n\
Cupertino, CA 95014\n\
\n\
For product information please call:408-555-5555\n\
For technical support please call: 408-555-5554"
#define kCoolSoftCADId "CoolSoft CAD"
#define kCoolSoftCADVersion "2.0v3"
#define kCoolSoftCADName "CoolSoft CAD 2.0v3"
#define kCoolSoftCADRequestSize 10
#define kCoolSoftCADConsumeRate TSeconds(30)
//.....................................................................
// Define our constants.
static const TLicenseVendor kCoolSoftCADVendor(
TLicenseVendorIdentifier(kCoolSoftVendorId),
TStandardText(kCoolSoftVendorContact));
static const TLicenseProduct kCoolSoftCADProduct(
TLicenseVendorIdentifier(kCoolSoftVendorId),
TLicenseProductIdentifier(kCoolSoftCADId),
TLicenseVersion(kCoolSoftCADVersion),
TStandardText(kCoolSoftCADName));
static long kCoolSoftCADSecrets[4] =
{0x12345678, 0xabcdef01, 0x0f1e2d3c, 0xfedcba98};
//.....................................................................
// Constructors and destructors
//
TCoolSoftCADLicenseUse::TCoolSoftCADLicenseUse() :
TLicenseUse(kCoolSoftCADProduct)
{
SetRequestSize(kCoolSoftCADRequestSize);
SetConsumptionRate(kCoolSoftCADConsumeRate);
}
TCoolSoftCADLicenseUse::~TCoolSoftCADLicenseUse()
{
}
// CoolSoftCAD specific implementation of the GetOperations pure virtual function.
//Note that "TRandomChallenge" is made up for sake of the example.
void
TCoolSoftCADLicenseUse::GetOperations(const TLicenseProduct& theProviderProduct,
TCollectionOf<TProviderOperation>& operations)
{
if(theProviderProduct == TAcmeLicenseProvider::kProduct)
{
TBasicChallenge basicChallenge(3, randomValueFromSomewhere);
operations.Add(&basicChallenge);
}
else if(theProviderProduct == TFlexLicenseProvider::kProduct)
{
TRandomChallenge randomChallenge(/*...*/);
operations.Add(&randomChallenge);
}
// etc.
}
// CoolSoftCAD specific implementation of the AcceptOperationsResults pure virtual function.
// Note that "TRandomChallenge" is made up for sake of this example.
void
TCoolSoftCADLicenseUse::AcceptOperationsResults(const TLicenseProduct&
theProviderProduct, const TCollectionOf<TProviderOperation>&
operations)
{
TDeleterFor< TIteratorOver<TProviderOperation> >
iterator(operations.CreateIterator());
for(TProviderOperation *op = iterator->First(); op != NULL;
op = iterator->Next())
{
TStandardText operationName;
op->GetOperationType(operationName);
if(operationName == TBasicChallenge::kOperationType)
{
if(!((TBasicChallenge*)op)->CompareSecret(
kCoolSoftCADSecrets[3]))
throw TCoolSoftCADOperationException(
TCoolSoftCADOperationException::kFailedtheTest);
}
else if(operationName == TRandomChallenge::kOperationType)
{
if(!op->MothersMaidenName())
throw TCoolSoftCADOperationException(
TCoolSoftCADOperationException::kWrongName);
}
// etc.
}
}
// CoolSoftCAD specific implementation of ReportException that will
// override the TLicenseUse provided default implementation.
void
TCoolSoftCADLicenseUse::ReportException(const TStandardException&
exception)
{
// Let the framework log the exception and present the dialog to
// the user. We put the ReportException call in a TRY block so
// that exception will not get thrown to the product. We only
// want the product to run really slow when it is not licensed.
try {
TLicenseUse::ReportException(exception);
}
catch(...)
{}
// Do my special stuff
MakeThisProductReallySlooowwwww();
}
// Cool Software, Inc. decided to allocate the license at static
// constructor time. The license will not actually be checked out until
// the first call to TCoolSoftCADLicenseUse::Check().
static TCoolSoftCADLicenseUse gCoolSoftCADLicenseUse;
// This is an example piece of the CoolSoftCAD product code that
// illustrates how the framework is activated at run time. This
// example entry point could easily be a "main" routine.
void
CoolSoftCADEntryPoint()
{
// First thing to do is check the licensing situation. We have
// already handled any possible exception in our ReportException
// function.
gCoolSoftCADLicenseUse.Check();
// Do our product stuff.
}