windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/t120/mst120/t120app.h
2020-09-26 16:20:57 +08:00

290 lines
7.5 KiB
C++

#ifndef _T120_APPLET_SAP_
#define _T120_APPLET_SAP_
/*
* include files
*/
#include "it120app.h"
#include "appsap.h"
class CApplet;
typedef enum
{
APPSESS_INITIALIZED,
APPSESS_ATTACH_USER_REQ,
APPSESS_ATTACH_USER_CON,
APPSESS_JOIN_MY_CHANNEL_REQ,
APPSESS_JOIN_MY_CHANNEL_CON,
APPSESS_JOIN_STATIC_CHANNEL_REQ,
APPSESS_JOIN_STATIC_CHANNEL_CON, // may go back to APPSESS_JOIN_STATIC_CHANNEL_REQ
APPSESS_INACTIVELY_ENROLL_REQ,
APPSESS_INACTIVELY_ENROLL_CON,
APPSESS_RESOURCE_REQ,
APPSESS_RESOURCE_CON, // may go back to APPSESS_RESOURCE_REQ
APPSESS_ACTIVELY_ENROLL_REQ,
APPSESS_ACTIVELY_ENROLL_CON,
APPSESS_JOINED,
APPSESS_LEAVING,
APPSESS_LEFT,
}
APPLET_SESSION_STATE;
typedef enum
{
NONE_CHOSEN,
ERROR_CHOSEN,
RESULT_CHOSEN,
}
SESSION_ERROR_TYPE;
typedef enum
{
DCJS_INITIALIZED,
DCJS_RETRIEVE_ENTRY_REQ,
DCJS_RETRIEVE_ENTRY_CON,
DCJS_EXISTING_CHANNEL_JOIN_REQ,
DCJS_EXISTING_CHANNEL_JOIN_CON,
DCJS_NEW_CHANNEL_JOIN_REQ,
DCJS_NEW_CHANNEL_JOIN_CON,
DCJS_REGISTER_CHANNEL_REQ,
DCJS_REGISTER_CHANNEL_CON,
}
DYNCHNL_JOIN_STATE;
class CAppletSession : public IT120AppletSession, public CRefCount
{
friend class CApplet;
friend void CALLBACK MCS_SapCallback(UINT, LPARAM, LPVOID);
friend void CALLBACK GCC_SapCallback(GCCAppSapMsg *);
public:
CAppletSession(CApplet *, T120ConfID);
~CAppletSession(void);
/* exit the conference */
STDMETHOD_(void, ReleaseInterface) (THIS);
STDMETHOD_(void, Advise) (THIS_
IN LPFN_APPLET_SESSION_CB pfnCallback,
IN LPVOID pAppletContext,
IN LPVOID pSessionContext);
STDMETHOD_(void, Unadvise) (THIS);
/* basic info */
STDMETHOD_(T120ConfID, GetConfID) (THIS) { return m_nConfID; }
STDMETHOD_(BOOL, IsThisNodeTopProvider) (THIS);
STDMETHOD_(T120NodeID, GetTopProvider) (THIS);
/* join/leave */
STDMETHOD_(T120Error, Join) (THIS_
IN T120JoinSessionRequest *);
STDMETHOD_(void, Leave) (THIS);
/* send data */
STDMETHOD_(T120Error, AllocateSendDataBuffer) (THIS_
IN ULONG,
OUT void **);
STDMETHOD_(void, FreeSendDataBuffer) (THIS_
IN void *);
STDMETHOD_(T120Error, SendData) (THIS_
IN DataRequestType,
IN T120ChannelID,
IN T120Priority,
IN LPBYTE,
IN ULONG,
IN SendDataFlags);
/* ------ ADVANCED METHODS ---- */
STDMETHOD_(T120Error, InvokeApplet) (THIS_
IN GCCAppProtEntityList *,
IN GCCSimpleNodeList *,
OUT T120RequestTag *);
STDMETHOD_(T120Error, InquireRoster) (THIS_
IN GCCSessionKey *);
/* ------ registry services ------ */
STDMETHOD_(T120Error, RegistryRequest) (THIS_
IN T120RegistryRequest *);
/* ------ channel services ------ */
STDMETHOD_(T120Error, ChannelRequest) (THIS_
IN T120ChannelRequest *);
/* ------ token services ------ */
STDMETHOD_(T120Error, TokenRequest) (THIS_
IN T120TokenRequest *);
protected:
void GCCCallback(T120AppletSessionMsg *);
void MCSCallback(T120AppletSessionMsg *);
BOOL IsJoining(void);
//
// handy functions for the join process
//
void SetTempMsg(T120AppletSessionMsg *pMsg) { m_pTempMsg = pMsg; }
void ClearTempMsg(void) { m_pTempMsg = NULL; }
void HandleAttachUserConfirm(void);
void HandleJoinChannelConfirm(void);
void HandleEnrollConfirm(void);
void HandleRegisterChannelConfirm(void);
void HandleRetrieveEntryConfirm(void);
void HandleTokenGrabConfirm(void);
private:
void ClearError(void) { m_eErrorType = NONE_CHOSEN; }
void SetError(T120Error err) { m_eErrorType = ERROR_CHOSEN; m_Error.eError = err; }
void SetError(T120Result res) { m_eErrorType = RESULT_CHOSEN; m_Error.eResult = res; }
void SetState(APPLET_SESSION_STATE eState);
APPLET_SESSION_STATE GetState(void) { return m_eState; }
void SendMCSMessage(T120AppletSessionMsg *);
void SendCallbackMessage(T120AppletSessionMsg *);
T120Error DoEnroll(BOOL fEnroll, BOOL fEnrollActively = FALSE);
void DoJoinStaticChannels(void);
void DoResourceRequests(void);
void DoJoinDynamicChannels(BOOL fInitState);
void DoJoined(void);
void DoGrabTokenRequest(void);
void AbortJoin(void);
void SendJoinResult(T120Result eResult = T120_RESULT_SUCCESSFUL, T120Error eErrorCode = T120_NO_ERROR);
void FreeJoinRequest(BOOL fZeroOut);
private:
// remmember the context
LPVOID m_pAppletContext;
LPVOID m_pSessionContext;
LPFN_APPLET_SESSION_CB m_pfnCallback;
// parent applet object
CApplet *m_pApplet;
// tentative sap pointers
IMCSSap *m_pMCSAppletSAP;
// information about myself
T120ConfID m_nConfID;
T120UserID m_uidMyself;
T120SessionID m_sidMyself;
T120EntityID m_eidMyself;
T120NodeID m_nidMyself;
// join state
APPLET_SESSION_STATE m_eState;
ULONG m_nArrayIndex;
// error handling
SESSION_ERROR_TYPE m_eErrorType;
union
{
T120Error eError;
T120Result eResult;
} m_Error;
// join conference request copy
T120JoinSessionRequest m_JoinRequest; // valid during join session
BOOL m_fMCSFreeDataIndBuffer;
// dynamic channels join state
BOOL m_fFirstRoster;
DYNCHNL_JOIN_STATE m_eDynamicChannelJoinState;
T120AppletSessionMsg *m_pTempMsg;
};
class CSessionList : public CList
{
DEFINE_CLIST(CSessionList, CAppletSession*)
CAppletSession *FindByConfID(T120ConfID);
};
class CApplet : public IT120Applet, public CRefCount
{
friend void CALLBACK GCC_SapCallback(GCCAppSapMsg *);
public:
CApplet(T120Error *);
~CApplet(void);
STDMETHOD_(void, ReleaseInterface) (THIS);
STDMETHOD_(void, Advise) (THIS_
IN LPFN_APPLET_CB pfnCallback,
IN LPVOID pAppletContext);
STDMETHOD_(void, Unadvise) (THIS);
/* ------ Auto Join ------ */
STDMETHOD_(T120Error, RegisterAutoJoin) (THIS_
IN T120JoinSessionRequest *);
STDMETHOD_(void, UnregisterAutoJoin) (THIS);
/* ------ Session ------ */
STDMETHOD_(T120Error, CreateSession) (THIS_
OUT IT120AppletSession **,
IN T120ConfID);
void SendCallbackMessage(T120AppletMsg *pMsg);
IGCCAppSap *GetAppSap(void) { return m_pAppSap; }
void RegisterSession(CAppletSession *p) { m_SessionList.Append(p); }
void UnregisterSession(CAppletSession *p) { m_SessionList.Remove(p); }
CAppletSession *FindSessionByConfID(T120ConfID nConfID) { return m_SessionList.FindByConfID(nConfID); }
protected:
void GCCCallback(T120AppletSessionMsg *);
void HandleAutoJoin(T120ConfID);
private:
LPFN_APPLET_CB m_pfnCallback;
LPVOID m_pAppletContext;
IGCCAppSap *m_pAppSap;
CSessionList m_SessionList;
// for auto join
T120JoinSessionRequest *m_pAutoJoinReq;
CAppletSession *m_pAutoAppletSession;
};
#endif // _T120_APPLET_SAP_