/* * 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