#ifndef _GCC_CONTROLLER_ #define _GCC_CONTROLLER_ /* * gcontrol.h * * Copyright (c) 1995 by DataBeam Corporation, Lexington, KY * * Abstract: * It is the responsibility of the controller to create and destroy many * of the other objects in the system at run-time. There is should only * be one controller in existence at a time per GCC provider. The * controller is constructed during system initialization, and not * destroyed until the provider is shut down. The controller's primary * responsibility is to maintain five "layers" of objects in the system at * run-time. These include the Application Interface, the SAPs (the * Control SAP as well as the Application SAPs), the Conference objects, * the MCSUser object (which is actualy created by the conference object), * and the MCS Interface. It also "plugs" together objects in adjacent * layers by informing a newly created object of the identity of those * objects with which it must communicate. The newly created object can * then register itself with the appropriate objects in the layers above * and below. The controller plays a small role in the passing of * information during a conference (this is handled by the objects it * creates). * * It is worth noting that the controller is the primary recipient of * owner callbacks in the GCC system. Most of the objects in its "object * stack" are capable of issuing owner callbacks to the controller for * various events and requests. * * The controller is not completely portable. Since the nature of * application and MCS interfaces will vary from platform to platform, the * interface objects that must be created will also vary. It is necessary * for the controller to know which objects to create and destroy during * initialization and cleanup. Other than this, however, the rest of the * code in the controller class should port cleanly. * * The constructor performs all activity required to prepare GCC for use. * It creates an instance of the Memory Manager class (and possibly a * Message Memory Manager class in certain environments), which will be * used for memory handling by other objects in the system. It creates the * GccAppInterface objects that will be used to communicate with all user * applications (including the node controller). It creates the MCS * Interface object that will be used to communicate with MCS. GCC relies * on an owner callback from a GccAppInterface object to give it a * heartbeat. It is during this heartbeat that the controller does all of * its work at run-time. * * The destructor essentially does the opposite of what the constructor * does (as you might expect). It destroys all objects that are "owned" * by the controller, cleanly shutting everything down. * * As mentioned above, the controller is the primary recipient of owner * callbacks in the GCC system. To accomplish this it overrides the * Owner-Callback member function. It can then pass its "this" pointer to * objects that it creates, allowing them to issue owner callbacks when * necessary. Everything the controller does at run-time is in response * to these owner callbacks. * * The controller is the prime recipient of connect provider indications * from MCS. Many of the messages that are passed between GCC and the * GccAppInterface before a conference is established involve the * controller. These include ConferenceCreateIndication, * ConferenceInviteIndication, etc. Also, the controller object is * exclusively responsible for handling conference queries since it * maintains a complete list of all the conferences that exist in the * system. * * Portable: * Not Completely (80 % portable) * Member functions which aren't portable: * - GCCControl() * - ~GCCControl() * - EventLoop() * - PollCommDevices() * - CreateApplicationSap() * * Protected Instance Variables: * None. * * Caveats: * None. * * Author: * blp */ #include "sap.h" #include "csap.h" #include "appsap.h" #include "conf.h" #include "pktcoder.h" #include "privlist.h" #include "mcsdllif.h" #include "t120app.h" // #include "gccncif.h" extern CRITICAL_SECTION g_csGCCProvider; /* ** These are the message bases used by the controller object. Any ** owner callback message received from an object that the controller ** created must have a message base added to it before it is received ** at the controller. */ #define MCS_INTERFACE_MESSAGE_BASE 300 // Leave room for status enum { GCTRL_REBUILD_CONF_POLL_LIST = GCTRLMSG_BASE + 1, }; // permit to enroll callback list class CApplet; class CAppletList : public CList { DEFINE_CLIST(CAppletList, CApplet*) }; /* ** The conference information structure is used to temporarily store ** information needed to create a conference while waiting for a ** conference create response. */ typedef struct PENDING_CREATE_CONF { // a destructor to this data structure PENDING_CREATE_CONF(void); ~PENDING_CREATE_CONF(void); LPSTR pszConfNumericName; LPWSTR pwszConfTextName; BOOL password_in_the_clear; BOOL conference_is_locked; BOOL conference_is_listed; BOOL conference_is_conductible; GCCTerminationMethod termination_method; PPrivilegeListData conduct_privilege_list; PPrivilegeListData conduct_mode_privilege_list; PPrivilegeListData non_conduct_privilege_list; LPWSTR pwszConfDescription; ConnectionHandle connection_handle; UserID parent_node_id; UserID top_node_id; TagNumber tag_number; } PENDING_CREATE_CONF; /* ** This defines the template for the list that keeps track of information ** associated with a conference that is waiting for a response on a ** create conference indication. */ class CPendingCreateConfList2 : public CList2 { DEFINE_CLIST2(CPendingCreateConfList2, PENDING_CREATE_CONF*, GCCConfID) }; /* ** The join information structure is used to temporarily store ** information needed to join a conference after the join response is ** issued. */ typedef struct PENDING_JOIN_CONF { PENDING_JOIN_CONF(void); ~PENDING_JOIN_CONF(void); CPassword *convener_password; CPassword *password_challenge; LPWSTR pwszCallerID; BOOL numeric_name_present; GCCConfID nConfID; } PENDING_JOIN_CONF; /* ** This defines the template for the list that keeps track of information ** associated with an outstanding join request. */ class CPendingJoinConfList2 : public CList2 { DEFINE_CLIST2_(CPendingJoinConfList2, PENDING_JOIN_CONF*, ConnectionHandle) }; // Holds the list of outstanding query request class CPendingQueryConfList2 : public CList2 { DEFINE_CLIST2_(CPendingQueryConfList2, GCCConfID, ConnectionHandle) }; extern HANDLE g_hevGCCOutgoingPDU; class GCCController : public CRefCount { public: GCCController(PGCCError); ~GCCController(void); void RegisterAppSap(CAppSap *); void UnRegisterAppSap(CAppSap *); void RegisterApplet(CApplet *); void UnregisterApplet(CApplet *); CConf *GetConfObject(GCCConfID nConfID) { return m_ConfList2.Find(nConfID); } // Functions initiated from the node controller GCCError ConfCreateRequest(CONF_CREATE_REQUEST *, GCCConfID *); void WndMsgHandler ( UINT uMsg ); BOOL FlushOutgoingPDU ( void ); void SetEventToFlushOutgoingPDU ( void ) { ::SetEvent(g_hevGCCOutgoingPDU); } // Functions initiated from Control SAP GCCError ConfCreateResponse(PConfCreateResponseInfo); GCCError ConfQueryRequest(PConfQueryRequestInfo); GCCError ConfQueryResponse(PConfQueryResponseInfo); GCCError ConfJoinRequest(PConfJoinRequestInfo, GCCConfID *); GCCError ConfJoinIndResponse(PConfJoinResponseInfo); GCCError ConfInviteResponse(PConfInviteResponseInfo); GCCError FailConfJoinIndResponse(GCCConfID, ConnectionHandle); GCCError FailConfJoinIndResponse(PConfJoinResponseInfo); void RemoveConfJoinInfo(ConnectionHandle hConn); // Functions initiated from Conference object GCCError ProcessConfEstablished(GCCConfID); GCCError ProcessConfTerminated(GCCConfID, GCCReason); // Functions initiated from the MCS Interface GCCError ProcessConnectProviderIndication(PConnectProviderIndication); GCCError ProcessConferenceCreateRequest(PConferenceCreateRequest, PConnectProviderIndication); GCCError ProcessConferenceQueryRequest(PConferenceQueryRequest, PConnectProviderIndication); GCCError ProcessConferenceJoinRequest(PConferenceJoinRequest, PConnectProviderIndication); GCCError ProcessConferenceInviteRequest(PConferenceInviteRequest, PConnectProviderIndication); GCCError ProcessConnectProviderConfirm(PConnectProviderConfirm); GCCError ProcessConferenceQueryResponse(PConferenceQueryResponse, PConnectProviderConfirm); GCCError ProcessDisconnectProviderIndication(ConnectionHandle); void CancelConfQueryRequest(ConnectionHandle); private: /* ** Routines called from the Owner-Callback function */ // Miscelaneous support functions GCCConfID AllocateConferenceID(); GCCConfID AllocateQueryID(); GCCConfID GetConferenceIDFromName( PGCCConferenceName conference_name, GCCNumericString conference_modifier); void RebuildConfPollList ( void ); void PostMsgToRebuildConfPollList ( void ); private: CPendingCreateConfList2 m_PendingCreateConfList2; CPendingJoinConfList2 m_PendingJoinConfList2; CPendingQueryConfList2 m_PendingQueryConfList2; CConfList m_ConfDeleteList; CConfList2 m_ConfList2; CAppSapList m_AppSapList; BOOL m_fConfListChangePending; GCCConfID m_ConfIDCounter; GCCConfID m_QueryIDCounter; BOOL m_fControllerIsExiting; DWORD m_dwControllerWaitTimeout; DWORD m_dwControllerEventMask; // These list are used only for iterating. Whenever a conference or // application SAP object is deleted (or created in the case of an // application SAP) it is added to the dictionary list first and // a flag is set which forces the Polled list to get recreated at the // top of the next heartbeat. CConfList m_ConfPollList; // T120 Applet list CAppletList m_AppletList; }; extern GCCController *g_pGCCController; /* * GCCController (PGCCError gcc_error) * * Public member function of Conference * * Function Description * This is the Windows 32 Bit version of the GCC controller constructor. It * is responsible for initializing all the instance variables used by this * class. It is also responsible for creating the memory manager, the * packet coder, the Node Controller application interface, the Shared * memory interface used to communicate with enrolled applications, the * Node Controller SAP and the MCS Interface. It also sets up the * g_csGCCProvider that protects the core of GCC in the multi-threaded * Win32 environment. It also sets up a number of Windows Event objects * used to signal the GCC thread when various events happen at the * interfaces. The last thing it does before returning if no errors have * occured is launch the GCC thread. Fatal errors are returned from this * constructor in the return value. * * Formal Parameters: * gcc_error - (o) Errors that occur are returned here. * * Return Value * None. * * Side Effects * This constructor launches the GCC thread if no errors occur. * * Caveats * This constructor is very specific to the Win32 environment. When * porting GCC to other platforms, this constructor will have to be * rewritten for the proper platform. */ /* * GCCController( USHORT timer_duration, * PGCCError gcc_error) * * Public member function of Conference * * Function Description * This is the Windows 16 Bit version of the GCC controller constructor. It * is responsible for initializing all the instance variables used by this * class. It is also responsible for creating the memory manager, the * packet coder, the Node Controller application interface, the Shared * memory interface used to communicate with enrolled applications, the * Node Controller SAP and the MCS Interface. It also sets up the * internal Windows timer if a timer_interval other than zero is specified. * Fatal errors are returned from this constructor in the return value. * * Formal Parameters: * timer_duration - (i) Timer interval in miliseconds that the * heartbeat will trigger at. * instance_handle - (i) This is the windows instance handle used to * set up the Windows timer. * gcc_error - (o) Errors that occur are returned here. * * Return Value * None. * * Side Effects * None. * * Caveats * This constructor is very specific to the Win16 environment. When * porting GCC to other platforms, this constructor will have to be * rewritten for the proper platform. */ /* * ~GCCController(); * * Public member function of Conference * * Function Description * This is the Controller destructor. All platform specific cleanup that * occurs is included in this destructor but is "macro'd" out in * environments where the cleanup is not necessary (things like * critical sections, and Windows timers). Deleting the controller * essentially shuts down GCC. Deleting all the active conferences, SAPs, * and interfaces along with all the GCC support modules (memory manager, * packet coder, etc.). * * Formal Parameters: * None. * * Return Value * None. * * Side Effects * None. * * Caveats * This destructor includes platform specific code. It may be necessary * to include some platform specific code here when porting GCC to * other platforms. Macros should be used to isolate this code * where ever possible. */ /* * ULONG Owner-Callback ( UINT message, * LPVOID parameter1, * ULONG parameter2); * * Public member function of Conference * * Function Description * This function overides the base class function and is used to * receive all owner callback information from the objects the * the controller creates. * * Formal Parameters: * message - (i) Message number including base offset. * parameter1 - (i) void pointer of message data. * parameter2 - (i) Long holding message data. * * Return Value * GCC_NO_ERROR - No error occured. * GCC_ALLOCATION_FAILURE - Resource error occured. * GCC_INVALID_CONFERENCE_NAME - Invalid conference name passed in. * GCC_FAILURE_CREATING_DOMAIN - Failure creating domain. * GCC_BAD_NETWORK_ADDRESS - Bad network address passed in. * GCC_BAD_NETWORK_ADDRESS_TYPE - Bad network address type passed in. * GCC_CONFERENCE_ALREADY_EXISTS - Conference specified already exists. * GCC_INVALID_TRANSPORT - Cannot find specified transport. * GCC_INVALID_ADDRESS_PREFIX - Bad transport address passed in. * GCC_INVALID_TRANSPORT_ADDRESS - Bad transport address * GCC_BAD_SESSION_KEY - Enrolling with invalid session key. * GCC_INVALID_PASSWORD - Invalid password passed in. * GCC_BAD_USER_DATA - Invalid user data passed in. * GCC_INVALID_JOIN_RESPONSE_TAG - No match found for join response tag * GCC_NO_SUCH_APPLICATION - Invalid SAP handle passed in. * GCC_CONFERENCE_NOT_ESTABLISHED - Request failed because conference * was not established. * GCC_BAD_CAPABILITY_ID - Invalid capability ID passed in. * GCC_NO_SUCH_APPLICATION - Bad SAP handle passed in. * GCC_DOMAIN_PARAMETERS_UNACCEPTABLE - Domain parameters were * unacceptable for this connection. * * Side Effects * None. * * Caveats * None. */ /* * void EventLoop(); * * Public member function of Conference * * Function Description * This routine is only used for the 32 bit windows platform. It gets * called whenever an event occurs in this environment. These include * timer events as well as PDU and message events * * Formal Parameters: * None. * * Return Value * None. * * Side Effects * None. * * Caveats * None. */ #endif // _GCC_CONTROLLER_