99 lines
1.9 KiB
C++
99 lines
1.9 KiB
C++
/*
|
|
* Copyright 1995, 1996 Perforce Software. All rights reserved.
|
|
*
|
|
* This file is part of Perforce - the FAST SCM System.
|
|
*/
|
|
|
|
/*
|
|
* handler.h - last chance handlers to keep track of loose objects
|
|
*
|
|
* Handlers provide a way of associating an object with a string so
|
|
* context can be retained across RPC dispatched function calls.
|
|
* This is used for file transfers, which are carried out in a series
|
|
* of RPC calls. The sender picks a handle name and then uses that
|
|
* consistenly during the transfer. The receiver uses the provided handle
|
|
* name to stash and retrieve the object the represents the open file.
|
|
*
|
|
* Handlers also provide a means of tracking across objects. If any
|
|
* object encounters an error, it can mark the handle so that a subsequent
|
|
* call to AnyErrors() can report so.
|
|
*
|
|
* Public classes:
|
|
*
|
|
* Handlers - a list of LastChance objects
|
|
* LastChance - a virtual base class that gets deleted with the
|
|
* handlers.
|
|
*/
|
|
|
|
class LastChance;
|
|
|
|
struct Handler {
|
|
StrBuf name;
|
|
int anyErrors;
|
|
LastChance *lastChance;
|
|
} ;
|
|
|
|
class LastChance {
|
|
|
|
public:
|
|
LastChance()
|
|
{
|
|
handler = 0;
|
|
isError = 0;
|
|
}
|
|
|
|
virtual ~LastChance();
|
|
|
|
void Install( Handler *h )
|
|
{
|
|
handler = h;
|
|
handler->lastChance = this;
|
|
}
|
|
|
|
void SetError()
|
|
{
|
|
isError = 1;
|
|
}
|
|
|
|
void SetError( Error *e )
|
|
{
|
|
if( e->Test() ) isError = 1;
|
|
}
|
|
|
|
int IsError()
|
|
{
|
|
return isError;
|
|
}
|
|
|
|
private:
|
|
Handler *handler;
|
|
int isError;
|
|
|
|
} ;
|
|
|
|
const int maxHandlers = 10;
|
|
|
|
class Handlers {
|
|
|
|
public:
|
|
Handlers();
|
|
~Handlers();
|
|
|
|
void Install( const StrPtr *name,
|
|
LastChance *lastChance,
|
|
Error *e );
|
|
|
|
LastChance * Get( const StrPtr *name, Error *e = 0 );
|
|
|
|
int AnyErrors( const StrPtr *nane );
|
|
|
|
void SetError( const StrPtr *name, Error *e );
|
|
|
|
private:
|
|
|
|
int numHandlers;
|
|
Handler table[maxHandlers];
|
|
Handler *Find( const StrPtr *handle, Error *e = 0 );
|
|
} ;
|
|
|