Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

827 lines
22 KiB

/*
* token.h
*
* Copyright (c) 1993 - 1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This is the interface file for the Token class. Objects of this class
* represent tokens in the MCS environment. Whenever a token is allocated
* by a user, one of these objects is created. Its job is to handle all
* requests that are specific to the token ID with which it is associated.
*
* Tokens in the MCS environment are used for critical resource management.
* The exact use of tokens is up to the user applications attaching to
* MCS. They are provided as a generic resource.
*
* Tokens can be "owned" by one or more users. There are two types of
* ownership. There is exclusive ownership, where only one user can
* own the token at a time. That user has "grabbed" the token. And there
* is non-exclusive ownership, where several users can own the token at
* the same time. Those users have "inhibited" the token. It is not
* possible to mix exclusive and non-exclusive ownership.
*
* If a user has grabbed a token, that same user can inhibit the token,
* thus converting to non-exclusive ownership. Similarly, if a user is
* the sole inhibitor of a token, that user can grab the token, thus
* converting to exclusive ownership.
*
* During a domain merge operation, it is necessary to merge tokens upward
* to the new Top Provider of the enlarged domain. This class also defines
* a member function allowing it to be told to issue a merge request with
* all of its state contained therein.
*
* Caveats:
* None.
*
* Author:
* James P. Galvin, Jr.
*/
#ifndef _TOKEN_
#define _TOKEN_
/*
* This is the class definition for the Token class.
*/
class Token
{
public:
Token (
TokenID token_id,
PDomain local_provider,
PConnection top_provider,
CChannelList2 *channel_list,
CAttachmentList *attachment_list);
Token (
TokenID token_id,
PDomain local_provider,
PConnection top_provider,
CChannelList2 *channel_list,
CAttachmentList *attachment_list,
TokenState token_state,
UserID grabber,
CUidList *inhibitor_list,
UserID recipient);
~Token ();
void SetTopProvider(PConnection top_provider) { m_pConnToTopProvider = top_provider; }
BOOL IsTopProvider(void) { return (m_pConnToTopProvider == NULL); }
TokenState GetTokenState () { return (Token_State); };
BOOL IsValid ();
Void IssueMergeRequest ();
Void TokenGrabRequest (
CAttachment *originator,
UserID uidInitiator,
TokenID token_id);
Void TokenGrabConfirm (
Result result,
UserID uidInitiator,
TokenID token_id,
TokenStatus token_status);
Void TokenInhibitRequest (
CAttachment *originator,
UserID uidInitiator,
TokenID token_id);
Void TokenInhibitConfirm (
Result result,
UserID uidInitiator,
TokenID token_id,
TokenStatus token_status);
Void TokenGiveRequest (
CAttachment *originator,
PTokenGiveRecord pTokenGiveRec);
Void TokenGiveIndication (
PTokenGiveRecord pTokenGiveRec);
Void TokenGiveResponse (
Result result,
UserID receiver_id,
TokenID token_id);
Void TokenGiveConfirm (
Result result,
UserID uidInitiator,
TokenID token_id,
TokenStatus token_status);
Void TokenPleaseRequest (
UserID uidInitiator,
TokenID token_id);
Void TokenPleaseIndication (
UserID uidInitiator,
TokenID token_id);
Void TokenReleaseRequest (
CAttachment *originator,
UserID uidInitiator,
TokenID token_id);
Void TokenReleaseConfirm (
Result result,
UserID uidInitiator,
TokenID token_id,
TokenStatus token_status);
Void TokenTestRequest (
CAttachment *originator,
UserID uidInitiator,
TokenID token_id);
Void TokenTestConfirm (
UserID uidInitiator,
TokenID token_id,
TokenStatus token_status);
private:
BOOL ValidateUserID (
UserID user_id);
CAttachment *GetUserAttachment (
UserID user_id);
Void IssueTokenReleaseIndication (
UserID user_id);
Void BuildAttachmentList (
CUidList *user_id_list,
CAttachmentList *attachment_list);
TokenID Token_ID;
PDomain m_pDomain;
PConnection m_pConnToTopProvider;
CChannelList2 *m_pChannelList2;
CAttachmentList *m_pAttachmentList;
TokenState Token_State;
UserID m_uidGrabber;
CUidList m_InhibitorList;
UserID m_uidRecipient;
};
/*
* Token (
* TokenID token_id,
* PDomain local_provider,
* PConnection top_provider,
* PChannelList channel_list,
* PAttachmentList attachment_list)
*
* Functional Description:
* This is the constructor for the Token class. It simply initializes
* local instance variables with the passed in values. It also marks
* the state of the token as available.
*
* Formal Parameters:
* token_id (i)
* This is the token ID that this token object is associated with.
* local_provider (i)
* This is a pointer to the local provider. A Token object will
* never actually send a command to the local provider, but it needs
* this value to use a parameter when it sends commands to various
* attachments (since it is doing so on behalf of the local provider).
* top_provider (i)
* This is a pointer to the top provider. This is used by the
* Token object when it needs to issue a request to the Top
* Provider.
* channel_list (i)
* This is a pointer to the domain's channel list, which identifies
* all valid channels in the domain. This is used by token objects
* to validate user IDs.
* attachment_list (i)
* This is a pointer to the domain's attachment list, which identifies
* all valid attachments in the domain. This is used by token
* objects to validate joined attachments.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Token (
* TokenID token_id,
* PDomain local_provider,
* PConnection top_provider,
* PChannelList channel_list,
* PAttachmentList attachment_list,
* TokenState token_state,
* UserID grabber,
* CUidList *inhibitor_list,
* UserID recipient)
*
* Functional Description:
* This is the constructor for the Token class. It simply initializes
* local instance variables with the passed in values. It also marks
* the state of the token as available.
*
* Formal Parameters:
* token_id (i)
* This is the token ID that this token object is associated with.
* local_provider (i)
* This is a pointer to the local provider. A Token object will
* never actually send a command to the local provider, but it needs
* this value to use a parameter when it sends commands to various
* attachments (since it is doing so on behalf of the local provider).
* top_provider (i)
* This is a pointer to the top provider. This is used by the
* Token object when it needs to issue a request to the Top
* Provider.
* channel_list (i)
* This is a pointer to the domain's channel list, which identifies
* all valid channels in the domain. This is used by token objects
* to validate user IDs.
* attachment_list (i)
* This is a pointer to the domain's attachment list, which identifies
* all valid attachments in the domain. This is used by token
* objects to validate joined attachments.
* token_state (i)
* This is the state of the token being merged.
* grabber (i)
* This is the user ID of the user who has the token grabbed (this is
* only valid if the token state is grabbed or giving).
* inhibitor_list (i)
* This is a list of the users who have the token inhibited (this is
* only valid if the token state is inhibited).
* recipient (i)
* This is the user ID of the user who is being offered the token
* as part of a give operation (this is only valid if the token state
* is giving or given).
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* ~Token ()
*
* Functional Description:
* This is a virtual destructor defined for the Token class. It does
* nothing at this time.
*
* Formal Parameters:
* None.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void SetTopProvider (
* PConnection top_provider)
*
* Functional Description:
* This member function is used to change the identity of the Top Provider
* in an existing token. The only time this will really occur is when
* a provider that used to be the Top Provider merges into another
* domain, and therefore ceases to be the Top Provider. When the merge
* operation has been successfully completed, this function allows the
* domain to inform all of its Token objects about the identity of
* the new Top Provider.
*
* Formal Parameters:
* top_provider (i)
* This is a pointer to the new Top Provider.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* TokenState GetTokenState ()
*
* Functional Description:
* This function returns the current state of the token. This is used
* by the caller primarily during a merge operation, when decisions have
* to made about what tokens can and cannot be merged.
*
* Formal Parameters:
* None.
*
* Return Value:
* TOKEN_AVAILABLE if the token is not in use.
* TOKEN_GRABBED if the token is currently grabbed.
* TOKEN_INHIBITED if the token is currently inhiited.
* TOKEN_GIVING if the token is currently in the giving state.
* TOKEN_GIVEN if the token is currently in the given state.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* BOOL IsValid ()
*
* Functional Description:
* This function returns TRUE if the token is still valid, or FALSE if the
* token needs to be deleted. A token is valid if it has ANY owners
* (grabbers, inhibitors, or recipient).
*
* Formal Parameters:
* None.
*
* Return Value:
* TRUE if the token is valid.
* FALSE if the token needs to be deleted.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void IssueMergeRequest ()
*
* Functional Description:
* This function is called during a domain merge operation. It causes
* the token object to pack it state and send it out in a merge token
* request to the top provider.
*
* Formal Parameters:
* None.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenGrabRequest (
* PCommandTarget originator,
* UserID uidInitiator,
* TokenID token_id)
*
* Functional Description:
* This function is called when a user wishes to grab a token. Depending
* on the current state of the token, the request will either succeed or
* fail. Either way, an appropriate token grab confirm will be issued
* to the requesting user.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenGrabConfirm (
* PCommandTarget originator,
* Result result,
* UserID uidInitiator,
* TokenID token_id,
* TokenStatus token_status)
*
* Functional Description:
* This function is called as a result of the top provider answering a
* previous grab request. It tells the user whether or not the request
* succeeded.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* result (i)
* This is the result of the request. RESULT_SUCCESSFUL indicates
* that the token was successfully grabbed.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
* token_status (i)
* This is the status of the token after this request is processed.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenInhibitRequest (
* PCommandTarget originator,
* UserID uidInitiator,
* TokenID token_id)
*
* Functional Description:
* This function is called when a user wishes to inhibit a token.
* Depending on the current state of the token, the request will either
* succeed or fail. Either way, an appropriate token inhibit confirm will
* be issued to the requesting user.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenInhibitConfirm (
* PCommandTarget originator,
* Result result,
* UserID uidInitiator,
* TokenID token_id,
* TokenStatus token_status)
*
* Functional Description:
* This function is called as a result of the top provider answering a
* previous inhibit request. It tells the user whether or not the request
* succeeded.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* result (i)
* This is the result of the request. RESULT_SUCCESSFUL indicates
* that the token was successfully inhibited.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
* token_status (i)
* This is the status of the token after this request is processed.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenGiveRequest (
* PCommandTarget originator,
* PTokenGiveRecord pTokenGiveRec)
*
* Functional Description:
* This function is called when a user wishes to give a token to another
* user. Depending on the current state of the token, the request will
* either succeed or fail. Either way, an appropriate token grab confirm
* will be issued to the requesting user.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* pTokenGiveRec (i)
* This is the address of a structure containing the following information:
* The ID of the user attempting to give away the token.
* The ID of the token being given.
* The ID of the user that the token is being given to.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenGiveIndication (
* PCommandTarget originator,
* PTokenGiveRecord pTokenGiveRec)
*
* Functional Description:
* This function is called when the top provider wants to indicate to a
* user that another user is offering them a token.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* pTokenGiveRec (i)
* This is the address of a structure containing the following information:
* The ID of the user attempting to give away the token.
* The ID of the token being given.
* The ID of the user that the token is being given to.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenGiveResponse (
* PCommandTarget originator,
* Result result,
* UserID receiver_id,
* TokenID token_id)
*
* Functional Description:
* This function is called in response to a previous give indication. It
* contains the user's answer as to whether or not the token was
* accepted.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* result (i)
* This is the result of the request. RESULT_SUCCESSFUL indicates that
* the recipient has accepted the token.
* token_id (i)
* This is the token being acted upon.
* receiver_id (i)
* This is the ID of the user that is to receive the token.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenGiveConfirm (
* PCommandTarget originator,
* Result result,
* UserID uidInitiator,
* TokenID token_id,
* TokenStatus token_status)
*
* Functional Description:
* This function is called to send a confirmation back to a user who
* is trying to give away a token. It lets the user know whether or
* not the operation was successful.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* result (i)
* This is the result of the request. RESULT_SUCCESSFUL indicates that
* the recipient has accepted the token.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
* token_status (i)
* This is the status of the token after the operation.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenPleaseRequest (
* PCommandTarget originator,
* UserID uidInitiator,
* TokenID token_id)
*
* Functional Description:
* This function is called when a user wishes to ask the current owners
* of a token to relinquish it.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenPleaseIndication (
* PCommandTarget originator,
* UserID uidInitiator,
* TokenID token_id)
*
* Functional Description:
* This function is initially called by the top provider in response to
* a received token please request. It is forwarded to all users who
* currently own the specified token, asking them to relinquish it.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* BOOL TokenReleaseRequest (
* PCommandTarget originator,
* UserID uidInitiator,
* TokenID token_id)
*
* Functional Description:
* This function is called when a user wishes to release a token.
* Depending on the current state of the token, the request will either
* succeed or fail. Either way, an appropriate token release confirm will
* be issued to the requesting user.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenReleaseConfirm (
* PCommandTarget originator,
* Result result,
* UserID uidInitiator,
* TokenID token_id,
* TokenStatus token_status)
*
* Functional Description:
* This function is called as a result of the top provider answering a
* previous release request. It tells the user whether or not the request
* succeeded.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* result (i)
* This is the result of the request. RESULT_SUCCESSFUL indicates
* that the token was successfully released.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
* token_status (i)
* This is the status of the token after this request is processed.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenTestRequest (
* PCommandTarget originator,
* UserID uidInitiator,
* TokenID token_id)
*
* Functional Description:
* This function is called when a user wishes to test the current state
* of a token. The token will issue a token test confirm to the
* originating user containing the requested information.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being acted upon.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* Void TokenTestConfirm (
* PCommandTarget originator,
* UserID uidInitiator,
* TokenID token_id,
* TokenStatus token_status)
*
* Functional Description:
* This function is called as a result of the top provider answering a
* previous test request. It tells the user the current state of the
* token.
*
* Formal Parameters:
* originator (i)
* This is a pointer to the attachment that leads to the originator
* of the request.
* uidInitiator (i)
* This is the user ID of the user that originated the request.
* token_id (i)
* This is the token being tested.
* token_status (i)
* This is the current status of the token.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
#endif