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.
282 lines
13 KiB
282 lines
13 KiB
/****************************************************************************/
|
|
/* assiapi.cpp */
|
|
/* */
|
|
/* SaveScreenBits Interceptor API functions. */
|
|
/* */
|
|
/* Copyright(c) Microsoft, PictureTel 1992-1996 */
|
|
/* Copyright(c) Data Connection 1996 */
|
|
/* (C) 1997-1998 Microsoft Corp. */
|
|
/****************************************************************************/
|
|
|
|
#include <precomp.h>
|
|
#pragma hdrstop
|
|
|
|
#define TRC_FILE "assiapi"
|
|
#include <as_conf.hpp>
|
|
|
|
|
|
/****************************************************************************/
|
|
/* SSI_Init(..) */
|
|
/****************************************************************************/
|
|
void RDPCALL SHCLASS SSI_Init(void)
|
|
{
|
|
DC_BEGIN_FN("SSI_Init");
|
|
|
|
#define DC_INIT_DATA
|
|
#include <assidata.c>
|
|
#undef DC_INIT_DATA
|
|
|
|
TRC_DBG((TB, "Initializing SSI"));
|
|
|
|
DC_END_FN();
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* API FUNCTION: SSI_PartyJoiningShare */
|
|
/* */
|
|
/* Called when a new party is joining the share. */
|
|
/* */
|
|
/* PARAMETERS: */
|
|
/* */
|
|
/* locPersonID - local person ID of remote person joining the share. */
|
|
/* */
|
|
/* oldShareSize - the number of the parties which were in the share (ie */
|
|
/* excludes the joining party). */
|
|
/* */
|
|
/* RETURNS: TRUE if the party can join the share. */
|
|
/* FALSE if the party can NOT join the share. */
|
|
/****************************************************************************/
|
|
BOOL RDPCALL SHCLASS SSI_PartyJoiningShare(LOCALPERSONID locPersonID,
|
|
unsigned oldShareSize)
|
|
{
|
|
PTS_ORDER_CAPABILITYSET pLocalOrderCaps;
|
|
|
|
DC_BEGIN_FN("SSI_PartyJoiningShare");
|
|
DC_IGNORE_PARAMETER(oldShareSize)
|
|
|
|
/************************************************************************/
|
|
/* If this is the first party in the share, reset the interceptor code. */
|
|
/************************************************************************/
|
|
if (oldShareSize == 0)
|
|
{
|
|
SSIResetInterceptor();
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* Redetermine the size of the save screen bitmap. */
|
|
/************************************************************************/
|
|
SSIRedetermineSaveBitmapSize();
|
|
|
|
TRC_DBG((TB, "Person with network ID %d joining share", locPersonID));
|
|
|
|
SSICapabilitiesChanged();
|
|
|
|
DC_END_FN();
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* API FUNCTION: SSI_PartyLeftShare() */
|
|
/* */
|
|
/* SSI function called when a party has left the share. */
|
|
/* */
|
|
/* PARAMETERS: */
|
|
/* */
|
|
/* locPersonID - local person ID of remote person leaving the share. */
|
|
/* */
|
|
/* newShareSize - the number of the parties now in the call (ie excludes */
|
|
/* the leaving party). */
|
|
/****************************************************************************/
|
|
void RDPCALL SHCLASS SSI_PartyLeftShare(LOCALPERSONID locPersonID,
|
|
unsigned newShareSize)
|
|
{
|
|
DC_BEGIN_FN("SSI_PartyLeftShare");
|
|
|
|
DC_IGNORE_PARAMETER(locPersonID)
|
|
|
|
/************************************************************************/
|
|
/* Redetermine the size of the save screen bitmap. */
|
|
/************************************************************************/
|
|
SSIRedetermineSaveBitmapSize();
|
|
|
|
/************************************************************************/
|
|
/* If this is the last party in the share, free all resources for the */
|
|
/* call. */
|
|
/************************************************************************/
|
|
if (newShareSize == 0)
|
|
{
|
|
/********************************************************************/
|
|
/* Discard all saved bitmaps. */
|
|
/********************************************************************/
|
|
SSIResetInterceptor();
|
|
}
|
|
else
|
|
{
|
|
/********************************************************************/
|
|
/* Deal with new capabilities. */
|
|
/********************************************************************/
|
|
SSICapabilitiesChanged();
|
|
}
|
|
|
|
TRC_DBG((TB, "Person with network ID %d leaving share", locPersonID));
|
|
|
|
DC_END_FN();
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* FUNCTION: SSI_SyncUpdatesNow */
|
|
/* */
|
|
/* Called by the USR to start syncing data to the remote parties. */
|
|
/* The datastream subsequently sent by the SSI must not refer to any */
|
|
/* previously sent. */
|
|
/****************************************************************************/
|
|
void RDPCALL SHCLASS SSI_SyncUpdatesNow(void)
|
|
{
|
|
DC_BEGIN_FN("SSI_SyncUpdatesNow");
|
|
|
|
/************************************************************************/
|
|
/* Discard any saved bitmaps. This ensures that the subsequent */
|
|
/* datastream will not refer to any previously sent data. */
|
|
/************************************************************************/
|
|
SSIResetInterceptor();
|
|
|
|
DC_END_FN();
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* FUNCTION: SSI_UpdateShm */
|
|
/* */
|
|
/* Updates the Shared Memory with local values. Called on WinStation */
|
|
/* context. */
|
|
/****************************************************************************/
|
|
void RDPCALL SHCLASS SSI_UpdateShm(void)
|
|
{
|
|
DC_BEGIN_FN("SSI_UpdateShm");
|
|
|
|
m_pShm->ssi.resetInterceptor =
|
|
(m_pShm->ssi.resetInterceptor || ssiResetInterceptor);
|
|
ssiResetInterceptor = FALSE;
|
|
|
|
m_pShm->ssi.newSaveBitmapSize = ssiNewSaveBitmapSize;
|
|
|
|
m_pShm->ssi.saveBitmapSizeChanged =
|
|
(m_pShm->ssi.saveBitmapSizeChanged || ssiSaveBitmapSizeChanged);
|
|
ssiSaveBitmapSizeChanged = FALSE;
|
|
|
|
TRC_NRM((TB, "resetInterceptor(%u) newSaveBitmapSize(%u)"
|
|
" saveBitmapSizeChanged(%u)",
|
|
m_pShm->ssi.resetInterceptor,
|
|
m_pShm->ssi.newSaveBitmapSize,
|
|
m_pShm->ssi.saveBitmapSizeChanged ));
|
|
|
|
DC_END_FN();
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* FUNCTION: SSIEnumBitmapCacheCaps() */
|
|
/* */
|
|
/* Function passed to CPC_EnumerateCapabilities. It will be called with a */
|
|
/* capability structure for each person in the call corresponding to the */
|
|
/* TS_CAPSETTYPE_ORDER capability structure. */
|
|
/* */
|
|
/* PARAMETERS: */
|
|
/* */
|
|
/* personID - ID of person with these capabilities. */
|
|
/* */
|
|
/* pProtCaps - pointer to capabilities structure for this person. This */
|
|
/* pointer is only valid within the call to this function. */
|
|
/****************************************************************************/
|
|
void RDPCALL SHCLASS SSIEnumBitmapCacheCaps(
|
|
LOCALPERSONID personID,
|
|
UINT_PTR UserData,
|
|
PTS_CAPABILITYHEADER pCaps)
|
|
{
|
|
PTS_ORDER_CAPABILITYSET pOrderCaps;
|
|
|
|
DC_BEGIN_FN("SSIEnumBitmapCacheCaps");
|
|
|
|
DC_IGNORE_PARAMETER(UserData);
|
|
|
|
pOrderCaps = (PTS_ORDER_CAPABILITYSET)pCaps;
|
|
|
|
TRC_NRM((TB, "[%u]Receiver bitmap size %ld", (unsigned)personID,
|
|
pOrderCaps->desktopSaveSize));
|
|
|
|
/************************************************************************/
|
|
/* Set the size of the local send save screen bitmap to the minimum of */
|
|
/* its current size and this party's receive save screen bitmap size. */
|
|
/************************************************************************/
|
|
ssiNewSaveBitmapSize = min(ssiNewSaveBitmapSize,
|
|
pOrderCaps->desktopSaveSize);
|
|
|
|
DC_END_FN();
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* FUNCTION: SSIRedetermineSaveBitmapSize */
|
|
/* */
|
|
/* Enumerates all the people in the share and redetermines the size of the */
|
|
/* save screen bitmap depending on their and the local receive */
|
|
/* capabilities. */
|
|
/****************************************************************************/
|
|
void RDPCALL SHCLASS SSIRedetermineSaveBitmapSize(void)
|
|
{
|
|
PTS_ORDER_CAPABILITYSET pOrderCaps;
|
|
|
|
DC_BEGIN_FN("SSIRedetermineSaveBitmapSize");
|
|
|
|
/************************************************************************/
|
|
/* Enumerate all the save screen bitmap receive capabilities of the */
|
|
/* parties in the share. The usable size of the send save screen */
|
|
/* bitmap is then the minimum of all the remote receive sizes and the */
|
|
/* local send size. */
|
|
/************************************************************************/
|
|
ssiNewSaveBitmapSize = SAVE_BITMAP_WIDTH * SAVE_BITMAP_HEIGHT;
|
|
CPC_EnumerateCapabilities(TS_CAPSETTYPE_ORDER, NULL,
|
|
SSIEnumBitmapCacheCaps);
|
|
TRC_NRM((TB, "Sender bitmap size %ld", ssiNewSaveBitmapSize));
|
|
|
|
DC_END_FN();
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* SSIResetInterceptor */
|
|
/* */
|
|
/* DESCRIPTION: Reset the save screen bits interceptor */
|
|
/****************************************************************************/
|
|
void RDPCALL SHCLASS SSIResetInterceptor(void)
|
|
{
|
|
DC_BEGIN_FN("SSIResetInterceptor");
|
|
|
|
/************************************************************************/
|
|
/* Make sure the display driver resets the save level. */
|
|
/************************************************************************/
|
|
ssiResetInterceptor = TRUE;
|
|
DCS_TriggerUpdateShmCallback();
|
|
|
|
DC_END_FN();
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* Name: SSICapabilitiesChanged */
|
|
/* */
|
|
/* Purpose: Called when the SSI capabilities have been renegotiated. */
|
|
/****************************************************************************/
|
|
void RDPCALL SHCLASS SSICapabilitiesChanged(void)
|
|
{
|
|
DC_BEGIN_FN("SSICapabilitiesChanged");
|
|
|
|
ssiSaveBitmapSizeChanged = TRUE;
|
|
DCS_TriggerUpdateShmCallback();
|
|
|
|
DC_END_FN();
|
|
}
|
|
|