/*
 * appsap.h
 *
 *	Copyright (c) 1995 by DataBeam Corporation, Lexington, KY
 *
 *	Abstract:
 *		This is the interface file for the class CAppSap.  CAppSap
 *		objects represent an external user application's Service Access 
 *		Point to GCC.  This object inherits from the CBaseSap class. The CAppSap 
 *		object is instantiated when GCCCreateSap is called.  From that point 
 *		forward all messages to and from that application pass through this 
 *		object.  The object is explicitly deleted when GCCDeleteSap is called 
 *		or it is implicitly deleted when GCCCleanup is called by the Node 
 *		Controller.	 
 *
 *		The primary responsibility of the CAppSap object is to route
 *		incoming GCC primitives to their appropriate destination and to convert
 *		the primitives into a form that is understandable to the objects 
 *		processing them. A secondary responsibility of the CAppSap object is to 
 *		maintain a queue for all indications and confirm messages that are sent
 *		back to the registered application.  Commands can be routed by the 
 *		CAppSap in one of two directions. Either to the controller or to a 
 *		specified conference.  Commands that are passed to the controller, are
 *		done so using owner callbacks.  Commands that are routed to conferences
 *		are done so using command target calls and are routed based on a 
 *		Conference ID.  Note that various User Application commands will only be
 *		routed to the CConf if that application has previously enrolled 
 *		with the conference.  The CAppSap receives all confirms and indications
 *		from either the Controller or a CConf object.  These messages are
 *		formatted into GCCMessages within the CAppSap and queued up for later 
 *		delivery.  Periodically, the CAppSap's message queue is flushed by the 
 *		Controller object and the messages are delivered to the appropriate 
 *		application.
 *
 *	Caveats:
 *		The message structures that are passed back to the node controller
 *		are defined in GCC.H.
 *
 *	Author:
 *		blp
 */

#ifndef _APPSAP_
#define _APPSAP_

/*
 * include files 
 */
#include "igccapp.h"
#include "sap.h"
#include "clists.h"


/*
**	This is the message base that is passed into any SAP objects that use this
**	classes Owner callback.  It will typically be the controller's 
**	responsibility to pass this message on.
*/
#define	APPLICATION_MESSAGE_BASE			0

/*
**	Class definition
*/
class CAppSap : public CBaseSap, public IGCCAppSap 
{
    friend LRESULT CALLBACK SapNotifyWndProc(HWND, UINT, WPARAM, LPARAM);

public:

    CAppSap(LPVOID pAppData, LPFN_APP_SAP_CB, PGCCError);
    ~CAppSap(void);

    GCCAPI_(void)   ReleaseInterface(void);

    /* ------ IGCCAppSap Interface ------ */

    GCCAPI  AppEnroll(GCCConfID, GCCEnrollRequest *, PGCCRequestTag);
    GCCAPI  AppInvoke(GCCConfID, GCCAppProtEntityList *, GCCSimpleNodeList *, PGCCRequestTag);

    GCCAPI  AppRosterInquire(GCCConfID, GCCSessionKey *, GCCAppSapMsg **);
    GCCAPI_(void)  FreeAppSapMsg(GCCAppSapMsg *);

    GCCAPI_(BOOL)  IsThisNodeTopProvider(GCCConfID);
    GCCAPI_(GCCNodeID) GetTopProvider(GCCConfID);
    GCCAPI  ConfRosterInquire(GCCConfID, GCCAppSapMsg **);

    GCCAPI  RegisterChannel(GCCConfID, GCCRegistryKey *, ChannelID);
    GCCAPI  RegistryAssignToken(GCCConfID, GCCRegistryKey *);
    GCCAPI  RegistrySetParameter(GCCConfID, GCCRegistryKey *, LPOSTR, GCCModificationRights);
    GCCAPI  RegistryRetrieveEntry(GCCConfID, GCCRegistryKey *);
    GCCAPI  RegistryDeleteEntry(GCCConfID, GCCRegistryKey *);
    GCCAPI  RegistryMonitor(GCCConfID, BOOL fEnableDelivery, GCCRegistryKey *);
    GCCAPI  RegistryAllocateHandle(GCCConfID, ULONG cHandles);

    GCCAPI  ConductorInquire(GCCConfID);

    /* ------ IGCCAppSapNotify Handler ------ */

    GCCError PermissionToEnrollIndication(GCCConfID, BOOL fGranted);
    GCCError AppEnrollConfirm(GCCAppEnrollConfirm *);

    GCCError RegistryAllocateHandleConfirm(GCCConfID,
                                           ULONG        cHandles,
                                           ULONG        nFirstHandle,
                                           GCCResult);

    GCCError RegistryConfirm(GCCConfID,
                             GCCMessageType,
                             CRegKeyContainer *,
                             CRegItem *,
                             GCCModificationRights,
                             GCCNodeID                  nidOwner,
                             GCCEntityID                eidOwner,
                             BOOL                       fDeliveryEnabled,
                             GCCResult);

    GCCError RegistryMonitorIndication(GCCConfID                nConfID,
                                       CRegKeyContainer         *pRegKey,
                                       CRegItem                 *pRegItem,
                                       GCCModificationRights    eRights,
                                       GCCNodeID                nidOwner,
                                       GCCEntityID              eidOwner)
    {
        return RegistryConfirm(nConfID,
                               GCC_MONITOR_INDICATION,
                               pRegKey,
                               pRegItem,
                               eRights,
                               nidOwner,
                               eidOwner,
                               FALSE,
                               GCC_RESULT_SUCCESSFUL);
    }

    GCCError ConfRosterInquireConfirm(GCCConfID,
                                      PGCCConferenceName,
                                      LPSTR                 pszConfModifier,
                                      LPWSTR                pwszConfDescriptor,
                                      CConfRoster *,
                                      GCCResult,
                                      GCCAppSapMsgEx **);

    GCCError AppRosterInquireConfirm(GCCConfID,
                                     CAppRosterMsg *,
                                     GCCResult,
                                     GCCAppSapMsgEx **);

    GCCError AppRosterReportIndication(GCCConfID, CAppRosterMsg *);

    GCCError AppInvokeConfirm(GCCConfID, CInvokeSpecifierListContainer *, GCCResult, GCCRequestTag);
    GCCError AppInvokeIndication(GCCConfID, CInvokeSpecifierListContainer *, GCCNodeID nidInvoker);

    GCCError ConductorInquireConfirm(GCCNodeID nidConductor, GCCResult, BOOL fGranted, BOOL fConducted, GCCConfID);
    GCCError ConductorPermitGrantIndication(GCCConfID,
                            UINT cGranted, GCCNodeID *aGranted,
                            UINT cWaiting, GCCNodeID *aWaiting,
                            BOOL fThisNodeIsGranted);
    GCCError ConductorAssignIndication(GCCNodeID nidConductor, GCCConfID);
    GCCError ConductorReleaseIndication(GCCConfID);


protected:

    void NotifyProc(GCCAppSapMsgEx *pAppSapMsgEx);

private:

    void PostAppSapMsg(GCCAppSapMsgEx *pAppSapMsgEx);
    void PurgeMessageQueue(void);

private:

    LPVOID              m_pAppData;        // app defined user data
    LPFN_APP_SAP_CB     m_pfnCallback;
};



/*
 *	Comments explaining the public and protected class member functions
 */

/*
 *	CAppSap (
 *				UINT				owner_message_base,
 *				UINT				application_messsage_base)
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This is the constructor for the CAppSap class.  It initializes instance
 *		variables and registers with the new application.
 *
 *	Formal Parameters:
 *		owner_object		(i) A pointer to the owner of this object, namely
 *									the controller.
 *		owner_message_base	(i) The	message base offset for callbacks into the
 *									controller.
 *		application_object	(i)	A pointer to the application requesting service.
 *		application_messsage_base	(i) The message base offset for callbacks
 *											to the application.
 *		sap_handle			(i) The handle registered for this SAP.
 *
 *	Return Value:
 *		None.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	virtual 	~AppSap();
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This is the destructor for the CAppSap class.  It is called when the 
 *		controller marks the CAppSap to be deleted.  This occurs when either
 *		the CAppSap asks to be deleted due to an "unregister request" 
 *		issued from the client application, or when there is an error
 *		condition in the CAppSap.
 *
 *	Formal Parameters:
 *		owner_object		(i) A pointer to the owner of this object, namely
 *									the controller.
 *		owner_message_base	(i) The	message base offset for callbacks into the
 *									controller.
 *		application_object	(i)	A pointer to the application requesting service.
 *		application_messsage_base	(i) The message base offset for callbacks
 *											to the application.
 *		sap_handle			(i) The handle registered for this SAP.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_ALLOCATION_FAILURE			- A resource allocation error occurred.
 *		GCC_BAD_OBJECT_KEY				- An invalid object key passed in.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */

/*
 *	GCCError	AppEnroll(
 *					GCCConfID   			conference_id,
 *					PGCCSessionKey				session_key,
 *					BOOL					enroll_actively,
 *					UserID						application_user_id,
 *					BOOL					is_conducting_capable,
 *					MCSChannelType				startup_channel_type,
 *					UINT						number_of_non_collapsed_caps,
 *					PGCCNonCollapsingCapability *non_collapsed_caps_list,		
 *					UINT						number_of_collapsed_caps,
 *					PGCCApplicationCapability *	collapsed_caps_list,		
 *					BOOL					application_is_enrolled);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called when an application wants to enroll in a 
 *		conference.  The controller is notified of the enrollment request.
 *
 *	Formal Parameters:
 *		conference_id					(i) The conference identifier value.
 *		session_key						(i) Key identifying the session.
 *		enroll_actively					(i) Flag indicating whether to enroll
 *												actively or inactively.
 *		application_user_id				(i) The application identifier value.
 *		is_conducting_capable			(i) Flag indicating whether this app
 *												is capable of conducting.
 *		startup_channel_type			(i) The type of channel to use. 
 *		number_of_non_collapsed_caps	(i) Number of non-collapsed capabilities
 *		non_collapsed_caps_list			(i) List of non-collapsed capabilities.
 *		number_of_collapsed_caps		(i) Number of collapsed capabilities.
 *		collapsed_caps_list				(i) List of collapsed capabilities.
 *		application_is_enrolled)		(i) Flag indicating whether or not the
 *												application wishes to enroll.
 *
 *	Return Value:
 *		GCC_NO_ERROR				- No error.
 *		GCC_INVALID_MCS_USER_ID		- The user ID is less than the minimum value
 *		GCC_BAD_SESSION_KEY			- A NULL session key pointer is passed in.
 *		GCC_INVALID_CONFERENCE		- The conference does not exist at this node
 *		GCC_NO_SUCH_APPLICATION		- A SAP has not been registered for this app
 *		GCC_BAD_SESSION_KEY			- An invalid session key was passed in.
 *		GCC_INVALID_PARAMETER		- The node record was not found in the list.
 *		GCC_BAD_CAPABILITY_ID		- An invalid capability ID was passed in.
 *		GCC_ALLOCATION_FAILURE		- A resource allocation error occurred.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError		RegisterChannel(
 *								GCCConfID		conference_id,
 *								PGCCRegistryKey		registry_key,
 *								ChannelID			channel_id);	
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called when an application wishes to register a 
 *		channel.  The call is routed to the appropriate conference object.
 *
 *	Formal Parameters:
 *		conference_id					(i) The conference identifier value.
 *		registry_key					(i) Key identifying the session and
 *												resource ID.
 *		channel_id						(i) ID of channel to register
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_INVALID_CONFERENCE			- Conference not found to exist.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *		GCC_BAD_REGISTRY_KEY			- The registry key is invalid.
 *		GCC_APP_NOT_ENROLLED			- Requesting application is not
 *										  		enrolled with the conference.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError		RegistryAssignToken(
 *								GCCConfID		conference_id,
 *								PGCCRegistryKey		registry_key);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called when an application wishes to assign a 
 *		token.  The call is routed to the appropriate conference object.
 *
 *	Formal Parameters:
 *		conference_id					(i) The conference identifier value.
 *		registry_key					(i) Key identifying the session and
 *												resource ID.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_INVALID_CONFERENCE			- Conference not found to exist.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *		GCC_BAD_REGISTRY_KEY			- The registry key is invalid.
 *		GCC_APP_NOT_ENROLLED			- Requesting application is not
 *										  		enrolled with the conference.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError   		GCCRegistrySetParameterRequest (
 *								GCCConfID		 	conference_id,
 *								PGCCRegistryKey			registry_key,
 *								LPOSTR      			parameter_value,
 *								GCCModificationRights	modification_rights	);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called when an application wishes to set a 
 *		parameter.  The call is routed to the appropriate conference object.
 *
 *	Formal Parameters:
 *		conference_id					(i) The conference identifier value.
 *		registry_key					(i) Key identifying the session and
 *												resource ID.
 *		parameter_value					(i) String identifying the parameter
 *												to set.
 *		modification_rights				(i) Structure specifying the rights
 *												to be allowed for modifying
 *												the registry parameter.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_INVALID_CONFERENCE			- Conference not found to exist.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *		GCC_BAD_REGISTRY_KEY			- The registry key is invalid.
 *		GCC_APP_NOT_ENROLLED			- Requesting application is not
 *										  		enrolled with the conference.
 *		GCC_INVALID_MODIFICATION_RIGHTS	- The modification rights passed in
 *											were not valid.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError		GCCRegistryRetrieveEntryRequest(
 *								GCCConfID		conference_id,
 *								PGCCRegistryKey		registry_key);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called when an application wishes to retrieve a registry 
 *		entry.  The call is routed to the appropriate conference object.
 *
 *	Formal Parameters:
 *		conference_id					(i) The conference identifier value.
 *		registry_key					(i) Key identifying the session and
 *												resource ID.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_INVALID_CONFERENCE			- Conference not found to exist.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *		GCC_BAD_REGISTRY_KEY			- The registry key is invalid.
 *		GCC_APP_NOT_ENROLLED			- Requesting application is not
 *										  		enrolled with the conference.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError		GCCRegistryDeleteEntryRequest(
 *								GCCConfID		conference_id,
 *								PGCCRegistryKey		registry_key);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called when an application wishes to delete a registry 
 *		entry.  The call is routed to the appropriate conference object.
 *
 *	Formal Parameters:
 *		conference_id					(i) The conference identifier value.
 *		registry_key					(i) Key identifying the session and
 *												resource ID.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_INVALID_CONFERENCE			- Conference not found to exist.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *		GCC_BAD_REGISTRY_KEY			- The registry key is invalid.
 *		GCC_APP_NOT_ENROLLED			- Requesting application is not
 *										 		enrolled with the conference.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError		GCCRegistryMonitorRequest (
 *								GCCConfID		conference_id,
 *								BOOL			enable_delivery,
 *								PGCCRegistryKey		registry_key );
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called when an application wishes to monitor a 
 *		particular registry entry.  The call is routed to the appropriate 
 *		conference object.
 *
 *	Formal Parameters:
 *		conference_id					(i) The conference identifier value.
 *		enable_delivery					(i) Flag indicating whether to turn
 *												monitoring on or off.
 *		registry_key					(i) Key identifying the session and
 *												resource ID.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_INVALID_CONFERENCE			- Conference not found to exist.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *		GCC_BAD_REGISTRY_KEY			- The registry key is invalid.
 *		GCC_APP_NOT_ENROLLED			- Requesting application is not
 *										  		enrolled with the conference.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError		GCCRegistryAllocateHandleRequest (
 *								GCCConfID		conference_id,
 *								UINT				number_of_handles );
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called when an application wishes to allocate one or 
 *		more handles.  The call is routed to the appropriate conference object.
 *
 *	Formal Parameters:
 *		conference_id					(i) The conference identifier value.
 *		number_of_handles				(i) The number of handles to allocate.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_INVALID_CONFERENCE			- Conference not found to exist.
 *		GCC_BAD_NUMBER_OF_HANDLES		- The number of handles requested is
 *												not within the allowable range.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *		GCC_BAD_REGISTRY_KEY			- The registry key is invalid.
 *		GCC_APP_NOT_ENROLLED			- Requesting application is not
 *										  enrolled with the conference.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError		PermissionToEnrollIndication(
 *								GCCConfID		conference_id,
 *								PGCCConferenceName	conference_name,
 *								GCCNumericString	conference_modifier,
 *								BOOL			permission_is_granted);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called from a conference object when it wishes to send 
 *		an indication to the user application notifying it of a "permission to 
 *		enroll" event.  This does not mean that permission to enroll is
 *		necessarily granted to the application.  It may mean that permission is
 *		being revoked.
 *
 *	Formal Parameters:
 *		conference_id					(i) The conference identifier value.
 *		conference_name					(i) The conference name.
 *		conference_modifier				(i) The confererence modifier.
 *		permission_is_granted			(i) Flag indicating whether or not
 *												permission to enroll is granted.
 *
 *	Return Value:
 *		GCC_NO_ERROR				- No error.
 *		GCC_ALLOCATION_FAILURE		- A resource allocation error occurred.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */



/*
 *	GCCError	AppEnrollConfirm(GCCAppEnrollConfirm *);
 *								GCCConfID			conference_id,
 *								PGCCSessionKey			session_key,
 *								UINT					entity_id,
 *								UserID					node_id,
 *								GCCResult				result);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called by the CConf object when it wishes
 *		to send an enrollment confirmation to the user application.
 *
 *	Formal Parameters:
 *		conference_id				(i) The conference identifier value.
 *		session_key					(i) The key identifying the session.
 *		entity_id					(i) The ID for this instance of the 
 *											application.
 *		node_id						(i) ID for this node.
 *		result						(i) Result code indicating whether or not
 *											the enrollment was successful.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *		GCC_BAD_SESSION_KEY				- The session key is invalid.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError	RegistryConfirm (
 *						GCCConfID			conference_id,
 *						GCCMessageType			message_type,
 *						CRegKeyContainer        *registry_key_data,
 *						CRegItem                *registry_item_data,
 *						GCCModificationRights	modification_rights,
 *						UserID					owner_id,
 *						EntityID				entity_id,
 *						BOOL				enable_monitoring,
 *						GCCResult				result);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This command target routine is called by the CConf object when it
 *		wishes to send an registry confirmation to the user application.
 *
 *	Formal Parameters:
 *		conference_id				(i) The conference identifier value.
 *		message_type				(i) Indicates what type of registry item
 *											confirm this is.
 *		registry_key_data			(i) Object holding the registry key.
 *		registry_item_data			(i) Object holding the registry item.
 *		modification_rights			(i) Structure specifying the rights
 *											to be allowed for modifying
 *											the registry parameter.
 *		owner_id					(i) The ID of the owner of the registry item
 *		entity_id					(i) The ID for this instance of the 
 *											application.
 *		enable_monitoring			(i) Flag indicating whether the registry
 *											item is to be monitored.
 *		result						(i) Result code indicating whether or not
 *											the registry request was successful.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError	RegistryMonitorIndication(	
 *								GCCConfID			conference_id,
 *								CRegKeyContainer        *registry_key_data,
 *								CRegItem                *registry_item_data,
 *								GCCModificationRights	modification_rights,
 *								UserID					owner_id,
 *								EntityID				owner_entity_id);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This command target routine is called by the CConf object when it
 *		wishes to send a Registry monitor indication to the user application.
 *
 *	Formal Parameters:
 *		conference_id				(i) The conference identifier value.
 *		registry_key_data			(i) Object holding the registry key.
 *		registry_item_data			(i) Object holding the registry item.
 *		modification_rights			(i) Structure specifying the rights
 *											to be allowed for modifying
 *											the registry parameter.
 *		owner_id					(i) The ID of the owner of the registry item
 *		owner_entity_id				(i) The ID for the instance of the 
 *											application owning the registry.
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


/*
 *	GCCError	RegistryAllocateHandleConfirm(	
 *								GCCConfID			conference_id,
 *								UINT					number_of_handles,
 *								UINT					first_handle,
 *								GCCResult				result);
 *
 *	Public member function of CAppSap.
 *
 *	Function Description:
 *		This routine is called by the CConf object when it wishes
 *		to send an enrollment confirmation to the user application.
 *
 *	Formal Parameters:
 *		conference_id				(i) The conference identifier value.
 *		number_of_handles			(i) The number of handles allocated.
 *		first_handle				(i) The first handle allocated.
 *		result						(i) Result code indicating whether or not
 *											the handle allocation was successful
 *
 *	Return Value:
 *		GCC_NO_ERROR					- No error.
 *		GCC_ALLOCATION_FAILURE			- A resource error occurred.
 *
 *  Side Effects:
 *		None.
 *
 *	Caveats:
 *		None.
 */


#endif